Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: Composizione di classi

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    7

    Composizione di classi

    ciao a tutti sto studiando la relazione di composizione di classi e ho dedotto questo: per evitare la rottura dell'incapsulamento passando riferimenti come parametri d'ingresso o di uscita dei metodi bisogna simulare i passaggi per valore. Ora mi sto esercitando ed ho ideato una classe Spesa che è una composizione di oggetti della classe Prodotto;il codice è questo
    codice:
     public class Spesa {
        //attributi
        private ArrayList<Prodotto> ProdottiAcquistatati=new ArrayList<>(); //riferimento
        
        //costruttori
        public Spesa()
        {}
        public Spesa(ArrayList<Prodotto> s) //simulazione passaggio per valore
        {
            Iterator<Prodotto> iter=s.iterator();
            for(Prodotto p:s)
            {
              this.ProdottiAcquistatati.add(new Prodotto(iter.next().getPeso(),
                        iter.next().getPrezzoEtto(),iter.next().getScontoPercentuale()));
            }
        }
        // metodi
         public ArrayList<Prodotto> getSpesa() //simulazione passaggio per valore
         {
          ArrayList<Prodotto> s=new ArrayList<>();
          Iterator<Prodotto> iter=this.ProdottiAcquistatati.iterator();
          for(Prodotto p:this.ProdottiAcquistatati)
          {
              s.add(new Prodotto(iter.next().getPeso(),iter.next().getPrezzoEtto(),
                    iter.next().getScontoPercentuale()));
          }
          return s;
         }
        public void setProdottiAcquistati(ArrayList<Prodotto> s)
        {
          this.ProdottiAcquistatati=s;
        }
    dove la classe prodotto è la seguente:
    codice:
    public class Prodotto {
        //atributi
        private double Peso=0;//peso in kg
        private double PrezzoEtto=0; //prezzo all'etto
        private int ScontoPercentuale=0; //sconto in percentuale
        
        //costruttori
        public Prodotto()
        {}
        public Prodotto(double p,double pr,int s)
        {
            this.Peso=p;
            this.PrezzoEtto=pr;
            this.ScontoPercentuale=s;
        }
        
        //metodi
        public double getPeso()
        {
            return this.Peso;
        }
        public double getPrezzoEtto()
        {
            return this.PrezzoEtto;
        }
        public int getScontoPercentuale()
        {
            return this.ScontoPercentuale;
        }
        public void setPeso(float p)
        {
            this.Peso=p;
        }
        public void setPrezzoEtto(float pr)
        {
            this.PrezzoEtto=pr;
        }
        public void setScontoPercentuale(int s)
        {
            this.ScontoPercentuale=s;
        }
        @Override
        public String toString()
        {
            return "Peso: "+this.Peso+" Prezzo all'etto:"+this.PrezzoEtto+
                    " Sconto in Percentuale: "+this.ScontoPercentuale;
        }
                
    }
    Ora volevo sapere se ho rispettato l'incapsulamento e quindi ho simulato bene il passaggio per valore. Grazie in anticipo per l'aiuto

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Non ho guardato tutto, mi è caduto subito l'occhio su questa riga:

    s.add(new Prodotto(iter.next().getPeso(),iter.next().getPrez zoEtto(),
    iter.next().getScontoPercentuale()));

    Non penso faccia quello che pensi faccia...
    Ogni chiamata a next() porta avanti l'iteratore, in pratica stai creando un Prodotto usando valori di tre prodotti diversi.

    Ah, i campi delle classi vanno scritti con l'iniziale minuscola: prezzoEtto, non PrezzoEtto, ecc
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    7
    Grazie mille per l'aiuto
    ho corretto così:
    codice:
        public Spesa(ArrayList<Prodotto> s) //simulazione passaggio per valore
        {
            Iterator<Prodotto> iter=s.iterator();
            Prodotto aus;
            for(Prodotto p:s)
            {
              aus=iter.next();
              this.ProdottiAcquistatati.add(new Prodotto(aus.getPeso(),
                        aus.getPrezzoEtto(),aus.getScontoPercentuale()));
            }
        }
    Così credo vada bene giusto??

  4. #4
    perchè scomodare un ulteriore iterator
    codice:
    for(Prodotto p: s)
            {
    
              this.ProdottiAcquistatati.add(newProdotto(p.getPeso(),
                        p.getPrezzoEtto(),p.getScontoPercentuale()));
            }

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    7
    Grazie mille scusate per gli erroracci ma sono alle prime armi con java :P
    nessuno mi sa dire niente per quanto riguarda la composizione e la simulazione di passaggio per "valore"??

  6. #6
    Quote Originariamente inviata da bjunior Visualizza il messaggio
    Grazie mille scusate per gli erroracci ma sono alle prime armi con java :P
    nessuno mi sa dire niente per quanto riguarda la composizione e la simulazione di passaggio per "valore"??
    A occhio, non ho letto tutto, mi sembra che sia corretta...

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    7
    grazie ancora un ultima cosa: per il metodo setProdottiAcquistati non devo simulare il passaggio per valore perchè non sto passando il riferimento prodottiAcquistati come parametro d'ingresso o di uscita del metodo, giusto??

  8. #8
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    sinceramente non capisco perche` tu voglia fare una cosa simile. Qual e` il problema del passare la lista di prodotti per riferimento? Farne una copia poi rendere piu` difficile la manutenzione.

    Piu` che altro penso tu abbia sbagliato il modello. Di solito si fa:
    - una classe Ordine che rappresenta l'acquisto di una serie di prodotti
    - una classe prodotto che rappresenta i prodotti acqustabili
    - una classe rigaordine che lega i prodotti all'ordine specificando ulteriori parametri quali quantita`, taglia ed eventuali altre opzioni d'acquisto specifiche per il singolo ordine

    L'incapsulamento non e` necessariamente un male. I concetti che bisogna tener conto in fase di progettazione sono coesione e accoppiamento. Ci sono molte risorse in rete che ne parlano.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    7
    In totale sto facendo un progetto per gestire una spesa in una macelleria:
    ho scelto due classi: Carne e Formaggio che rappresentano i prodotti della macelleria e sono legati dalla relazione di ereditarietà alla classe prodotto che andrà a comporre la classe spesa da cui la classe registratore_di_cassa dipenderà.
    Dici che così non va bene??

  10. #10
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    Quote Originariamente inviata da bjunior Visualizza il messaggio
    In totale sto facendo un progetto per gestire una spesa in una macelleria:
    ho scelto due classi: Carne e Formaggio che rappresentano i prodotti della macelleria e sono legati dalla relazione di ereditarietà alla classe prodotto che andrà a comporre la classe spesa da cui la classe registratore_di_cassa dipenderà.
    Dici che così non va bene??
    no... segui la struttura che ti ho indicato io che e` quella tipica per i negozi. Mi sembra superfluo poi estendere Prodotto, semplicemente aggiungi come campo l'informazione sulla tipologia.

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.