Chiarimento classi

di il
46 risposte

46 Risposte - Pagina 2

  • Re: Chiarimento classi

    Certo, puoi fare tutto, dipende da chi ha bisogno di quelle informazioni.
    Siccome in alcuni post precedenti mi spiegavate che nei file di classe non si mettono le istruzioni di i/o.....
  • Re: Chiarimento classi

    trixy ha scritto:


    Nel senso che quando premo la barra spaziatrice il ciclo si arresta.
    Come ho detto prima, in Scanner i whitespace sono delimitatori (predefiniti) dei token. Quindi non li puoi ottenere da Scanner. E inoltre, se non lo sai, lo standard-input da una console è di norma bufferizzato fino a quando si preme invio. Detto in altro modo: tu puoi scrivere quanto input e token vuoi ma tutto quanto arriva alla applicazione SOLO quando l'utente preme invio.

    trixy ha scritto:


    Siccome in alcuni post precedenti mi spiegavate che nei file di classe non si mettono le istruzioni di i/o.....
    Nella programmazione ad oggetti esiste un principio molto importante che è quello del Single Responsibility Principle (SRP). Una classe dovrebbe avere una singola responsabilità, insomma essere focalizzata su un singolo obiettivo.

    Questo non vuol dire che una classe deve avere pochi campi/metodi. Una classe potrebbe avere 20 campi e 50 metodi. Non è quello il punto. Ma tutto il comportamento della classe dovrebbe essere focalizzato principalmente verso un singolo obiettivo.

    Se una classe Libro "modella" i dati di un libro, dovrebbe fare solo quello. Non deve fare query su DB, input dall'utente, scrittura su file o altro che sia palesemente differente dalla rappresentazione di un libro.
  • Re: Chiarimento classi

    Secondo voi così?
    class Articolo {
    	 private String nome; 
    	 private String descrizione;
    	 private double prezzo;
    	 
    		 public void  aggCodice ( String nome) 
    		 {
    			 this.nome=nome;
    		 }
    		 public void aggPrezzo (double prezzo)
    		 {
    			 this.prezzo=prezzo;
    		 }
    		 public void aggDescr (String descr)
    		 {
    			 this.descrizione=descr;
    		 }
    		 public void stampa()
    		 {
    			 System.out.println(nome+descrizione+prezzo);
    		 }
    	 }
    
    
    import java.util.Scanner;
    
    class Menu 
     {
    	 private void showMenu()
    	 {
    		 System.out.println();
    		 System.out.println("1   Aggiungi articolo");
    		 System.out.println("2   Elimina articolo");
    		 System.out.println("3   Visualizza listino");
    		 System.out.println("4   Esci");
    	 }
    	 public int selezione()
    	 {
    		 int selezione;
    		 Scanner scanner = new Scanner (System.in);
    		 showMenu();
    		 System.out.print("Cosa vuoi fare? ");
    		 selezione=scanner.nextInt();
    		 if (selezione==0)
    			 System.out.print("Cosa vuoi fare? ");
    			 return  selezione;
    	 }
    	 public int cancella()
    	 {  
    		 int cancella;
    		 Scanner scanner = new Scanner (System.in);
    		 System.out.print("Articolo da eliminare: ");
    		 cancella=scanner.nextInt();
    		 return cancella;		 
    	 }
    	 
    }
    
    import java.util.Vector;
    
    class Listino
    {
    	 private Vector list;
    	 public Listino()
    	 {
    		 list = new Vector (1,1);
    	 }
    	 public void addArticolo(Articolo a)
    	 {
    		 list.addElement(a);
    	 }
    	 public void eliminaArticolo(int cancella)
    	 {
    		 list.removeElement(cancella);
    	 }
    	 public void mostra()
    	 {
    		 Articolo a;
    		 System.out.print("\n\t\t\t *** Listino ***");
    		 for(int i=0; i<list.size(); i++)
    		 {
    			 System.out.print((i+1)+"  ");
    			 a = (Articolo) list.elementAt(i);
    			 a.stampa();
    		 }
    		 		
    	 }
    }
    
    
    public class ProgListino {
    
    	public static void main(String[] args) {
    		Listino nuovoListino = new Listino();
    		Menu nuovoMenu = new Menu();
    		int selezione;
    		
    		selezione = nuovoMenu.selezione();
    		while(selezione!=4)
    		{
    			if (selezione==1)
    			{
    				Articolo a = new Articolo();
    				nuovoListino.addArticolo(a);
    			}
    			else if (selezione==2)
    			{
    				int cancella = nuovoMenu.cancella();
    				nuovoListino.eliminaArticolo(cancella);
    			}
    			else if (selezione==3)
    			{
    				nuovoListino.mostra();
    			}
    		    selezione = nuovoMenu.selezione();}
    		
    		
    
    	
    
    }
    }
  • Re: Chiarimento classi

    trixy ha scritto:


    Secondo voi così?
    Articolo: più o meno. "agg" come inizio del metodo è poco significativo. Per convenzione i setter iniziano con set. Il stampa() non è di per sé proprio sbagliatissimo. Innanzitutto i 3 dati sono tutti attaccati ... si capirebbe poco.

    Menu: nota iniziale, in una applicazione console, new Scanner(System.in) va creato UNA volta sola. La classe va rivista un po'.

    Listino: sì, più o meno ok. In eliminaArticolo tu forse vuoi passare l'indice (allora chiama il parametro "indice", NON "cancella"). Ma il removeElement rimuove (ricercandolo) un oggetto. A te serve invece il removeElementAt(int index)
    Il mostra() sì più o meno ok (non è il massimo comunque). Per il Vector, se non conosci i "generics" ok. Se li conosci invece dovresti mettere Vector<Articolo> ed evitare quindi i cast.

    ProgListino: più o meno. Ma c'è la questione del nuovoMenu.cancella() che in realtà non è legato al menù.
  • Re: Chiarimento classi

    Infatti non funzion ail menù
  • Re: Chiarimento classi

    Non riesco a capire perchè non funziona. Quando digito 1 mi chiede l'articolo da eliminare
    class Articolo 
     {
    	 private String nome;
    	 private String descrizione;
    	 private float prezzo;
    	 public void setNome(String nome)
    	 {
    		 this.nome=nome;
    	 }
    	 public void setDescrizione(String descrizione)
    	 {
    		 this.descrizione=descrizione;
    	 }
    	 public void setPrezzo(float prezzo)
    	 {
    		 this.prezzo=prezzo;
    	 }
    	 public void stampa()
    	 {
    		System.out.printf("%-30s %-15s %f"+nome,descrizione,prezzo); 
    	 }
    }
    
    import java.util.Scanner;
    
    class Menu 
     {
    	Scanner scanner=new Scanner (System.in);
    	 private void mostraMenu()
    	 {
    	 System.out.println();
    	 System.out.println("1\tAggiungi articolo: ");
    	 System.out.println("2\tElimina articolo: ");
    	 System.out.println("3\tVisualizza listino: ");
    	 System.out.println("4\tEsci ");
    	 }
    	 public int selezione()
    	 {
    		 int selezione;
    		 mostraMenu();	 
    		 System.out.print("Cosa vuoi fare? ");
    		 selezione=scanner.nextInt();
    		 return selezione;
    	 }
    import java.util.Vector;
    import java.util.Scanner;
    
    class Listino 
     {
    	Scanner scanner = new Scanner (System.in);
    	 private Vector lista;
    	 
    	 public Listino()
    	 {
    		 lista  = new Vector(1,1);
    	 }
    	 public void aggiungiArticolo(Articolo a)
    	 {
    		 lista.addElement(a);
    	 }
    	 public void eliminaArticolo(int indice)
    	 {
    		 lista.removeElementAt(indice);
    		 System.out.print("Eliminazione effettuata con successo");
    	 }
    	 public void visualizza()
    	 {
    		 Articolo a;
    		 System.out.print("\t\t\t*** Listino ***");
    		 for (int i=0; i<lista.size(); i++)
    		 {
    			 a=(Articolo) lista.elementAt(i);
    			 a.stampa();
    		 }
    	 }
    }
    
    import java.util.Scanner;
    
    public class ProgListino {
    
    	public static void main(String[] args) {
    		Scanner scanner = new Scanner (System.in);
    		Listino newListino = new Listino();
    		Menu newMenu  = new Menu();
    		int selezione;
    		selezione=newMenu.selezione();
    		switch (selezione)
    		{
    		case 1: Articolo a  = new Articolo ();newListino.aggiungiArticolo(a);
    		case 2: System.out.print("\nArticolo da eliminare: ");int indice=scanner.nextInt(); newListino.eliminaArticolo(indice);
    		case 3: newListino.visualizza();
    		case 4: System.exit(0);
    		default: System.out.print("Selezione non valida");			
    		}
    	}
    }
    
  • Re: Chiarimento classi

    trixy ha scritto:


    Non riesco a capire perchè non funziona. Quando digito 1 mi chiede l'articolo da eliminare
    Innanzitutto te lo ripeto: new Scanner(System.in) va fatto 1 volta sola all'interno di una applicazione console.


    Poi questo è sicuramente sbagliato:

    System.out.printf("%-30s %-15s %f"+nome,descrizione,prezzo);

    Ci sono 3 specificatori di formato e quindi oltre alla stringa di formato vanno passati 3 argomenti.

    System.out.printf("%-30s %-15s %f", nome, descrizione, prezzo);
  • Re: Chiarimento classi

    Innanzitutto te lo ripeto: new Scanner(System.in) va fatto 1 volta sola all'interno di una applicazione console.
    Quindi cosa significa?che lo devo mettere solo nel file di programma?
  • Re: Chiarimento classi

    Forse mi conviene spostare tutto il codice stto al menu nel case
  • Re: Chiarimento classi

    trixy ha scritto:


    Forse mi conviene spostare tutto il codice stto al menu nel case
    Sì, per il momento metti tutta la gestione del menù e dell'input (con Scanner) in ProgListino. In Listino ci metti quanto serve per rappresentare e gestire "logicamente" un listino (niente input dall'utente!). E in Articolo la rappresentazione di un articolo, come hai fatto.
  • Re: Chiarimento classi

    Maperchè quando selezione è 1 ottengo il seguente risultato??

    *** Listino ***null null 0,000000

    Io mi aspetterei di inserire tutti i dati relativi all'articolo....
  • Re: Chiarimento classi

    trixy ha scritto:


    Maperchè quando selezione è 1 ottengo il seguente risultato??

    *** Listino ***null null 0,000000
    Hai chiesto in input i singoli dati dell'articolo che poi setti nell'oggetto Articolo?
  • Re: Chiarimento classi

    Li dovrebbe mettere in "a"

    case 1: Articolo a = new Articolo ();newListino.aggiungiArticolo(a);
  • Re: Chiarimento classi

    trixy ha scritto:


    case 1: Articolo a = new Articolo ();newListino.aggiungiArticolo(a);
    No, così non hai settato alcun dato.

    A parte Articolo e Listino, per il ProgListino segui come traccia il seguente approccio (abbozzato .. lo devi completare tu!):
    public class ProgListino {
        private static final int OPZIONE_AGGIUNTA = 1;
        // ....
        private static final int OPZIONE_USCITA = 4;
    
        private Scanner stdIn = new Scanner(System.in);
        private Listino listino = new Listino();
    
        public static void main(String[] args) {
            ProgListino progListino = new ProgListino();
            progListino.gestione();
        }
    
        private void gestione() {
            int opzione;
    
            do {
                opzione = leggiOpzioneMenu();
    
                switch (opzione) {
                case OPZIONE_AGGIUNTA:
                    aggiuntaArticolo();
                    break;
                case OPZIONE_XXX:
                    // ecc...
                    break;
                // ..........
                }
            } while (opzione != OPZIONE_USCITA);
        }
    
        private void aggiuntaArticolo() {
            // leggi un articolo poi lo inserisci nel listino
        }
        
        // ........
    
        private int leggiOpzioneMenu() {
            // stampa le opzioni del menù
            // usa leggiInt per leggere l'opzione che poi restituisci
        }
    
        private Articolo leggiArticolo() {
            // usa i leggiXXX (quelli sotto) per leggere i dati
            // crea, imposta e restituisci un oggetto Articolo
        }
    
        private String leggiString(String prompt) {
            // stampa il prompt
            // leggi e restituisci una stringa
        }
    
        private int leggiInt(String prompt) {
            // stampa il prompt
            // leggi e restituisci un int (puoi anche gestire la ripetizione in caso di errore)
        }
    
        private float leggiFloat(String prompt) {
            // stampa il prompt
            // leggi e restituisci un float (puoi anche gestire la ripetizione in caso di errore)
        }
    }
  • Re: Chiarimento classi

    Ma io non è che chido il codice del programma,io vorrei semplicemente capire cosa combino visto che il libro, dopo aver spiegato i vettori, mi chiede di fare un programma del genere.
Devi accedere o registrarti per scrivere nel forum
46 risposte