Newsgroup: it.comp.java
Titolo: 2 soluzioni a confronto

Dunque su un libro ho trovato il seguente esercizio;
data la classe Die(dado):
public class Die
{
   private final int MIN_FACES = 4;
   private int numFaces;    
   private int faceValue;  
   public Die ()
   {
      numFaces = 6;
      faceValue = 1;
   }
   public Die (int faces)
   {
      if (faces < MIN_FACES)
         numFaces = 6;
      else
         numFaces = faces;
      faceValue = 1;
   }
   public int roll ()
   {
      faceValue = (int) (Math.random() * numFaces) + 1;
      return faceValue;
   }
   public int getFaceValue ()
   {
      return faceValue;
   }
}
progettare una classe PairOfDice composta da 2 oggetti Die a 6 facce.
Creare una classe driver che tiri + volte un oggetto PairOfDice
contando il numero di doppi 6 realizzati-
ho provato 2 soluzioni 
**************************************1°soluzione 
public class PairOfDice
{
   private int faceValue1;
   private int faceValue2;
   private int doppi6;
 
   public int tira(Die d1, Die d2)
   {
      faceValue1 = d1.roll();
      faceValue2 = d2.roll();
      if((faceValue1+faceValue2)==12)
		doppi6++;
      return (faceValue1+faceValue2);
   }
   public  int numDoppi6 ()
   {
      return doppi6;
   }
 
}
public class SnakeEyes
{
 
   public static void main (String[] args)
   {
      final int ROLLS = 250;
      int num1;
      int doppi6;
      Die die1 = new Die();
      Die die2 = new Die();
      PairOfDice pair1=new PairOfDice();
      for (int roll = 1; roll <= ROLLS; roll++)
      {
		num1=pair1.tira(die1, die2);
                System.out.println ("ho fatto: " + num1);
      }
      doppi6=pair1.numDoppi6 ();
      System.out.println ("ho fatto " + doppi6+" volte doppi 6 ");
   }
}
**************************************2°soluzione 
public class PairOfDice2
{
 
   private int faceValue1;
   private int faceValue2;
   private int doppi6;
   private Die d1;
   private Die d2;
 
   public PairOfDice2 ()
   {
       d1 = new Die();    
       d2 = new Die();  
   }
   public int tira()
   {
      faceValue1 = d1.roll();
      faceValue2 = d2.roll();
      if((faceValue1+faceValue2)==12)
		doppi6++;
      return (faceValue1+faceValue2);
   }
   public  int numDoppi6 ()
   {
      return doppi6;
   }
}
public class SnakeEyes2
{
   public static void main (String[] args)
   {
      final int ROLLS = 250;
      int num1;
      int doppi6;
      PairOfDice2 pair1=new PairOfDice2();
      for (int roll = 1; roll <= ROLLS; roll++)
      {
	num1=pair1.tira();
        System.out.println ("ho fatto: " + num1);
      }
      doppi6=pair1.numDoppi6 ();
      System.out.println ("ho fatto " + doppi6+" volte doppi 6 ");
   }
}
Diciamo che nel primo caso la classe PairOfDice  utilizza gli oggetti
Die solo come parametri di un proprio metodo mentre nel secondo(forse
+ coerentemente con il testo dell'esercizio) la classe PairOfDice2 ha
tra le sue variabili 2 oggetti Die che poi vengono utilizzati.
Quale è la migliore soluzione e perchè(io direi di corsa la seconda ma
i motivi sono unpo'intuitivi)?
E' uno dei primi esercizi che faccio quindi qualunque commento e
insulto è ben accetto.
Ovviamente accetto anche altre soluzioni purchè siano coerenti con il
testo dell'esercizio (e utilizzino quindi 2 oggetti Die)
ciao e grazie(ah se sapete un sito dove ci sono degli esercizi java
con relative soluzioni fatemi un fischio, grazie)

...

vabbeh forse è un post troppo lungo...

 ha scritto nel messaggio 
news:242c8daa.04112...@posting.google.com...

Beh, si è un pò lungo ... ma ecco cosa ne penso:
La soluzione 2 mi sembra da preferire alla 1, anzi poichè il testo dice
" progettare una classe PairOfDice COMPOSTA da 2 oggetti Die "
direi che la soluzione 2 è obbligatoria ...
Perchè hai deciso di creare numDoppi6 come property di PairOfDice ? Mi 
sembra sia più logico definorlo come property di SnakeEyes2, dopo tutto per 
contare quanti doppi 6 escono bisogna tirare i dadi, e questo è quello che 
fa l'oggetto SnakeEyes2
Anche faceValue1 e faceValue2 non mi convincono ... in realtà non servono.
Ecco una proposta alternativa:
public class PairOfDice {
    private Die die1;
    private Die die2;
    public PairOfDice() {
        die1 = new Die();
        die2 = new Die();
    }
    public void tira()
    {
        die1.roll();
        die2.roll();
    }
    public int getDie1(){
        return die1;
    }
    public int getDie2(){
        return die2;
    }
    public boolean isDoppio6(){
        return die1.getFaceValue() == die2.getFaceValue();
    }
}
public class SnakeEyes2 {
    public static void main (String[] args) {
        final int ROLLS = 250;
        int doppi6 = 0;
        PairOfDice pair=new PairOfDice();
        for (int roll = 1; roll <= ROLLS; roll++) {
            pair.tira();
            int totale = pair.getDie1().getFaceValue() + 
pair.getDie2().getFaceValue();
            System.out.println ("ho fatto: " + totale);
            if (pair.isDoppio6())
                doppi6++;
        }
        System.out.println ("ho fatto " + doppi6+" volte doppi 6 ");
    }
}
(non l'ho compilato, solo per dare l'idea ... )
ciao

grazie appena posso guardo

 Anche faceValue1 e faceValue2 non mi convincono ... in realtà non servono.
sono d'accordo
2 osservazioni:
1) elimineri anche il metodo isDoppio6 (occhio che il tuo e`
sbagliato, torna true se i dadi hanno dato un numero uguale) e farei
fare tutto alla classe driver.
2) eviterei che SnakeEyes2 acceda direttamente ai singoli Die mi
sembra un approccio + "object oriented" perche` evita dipendenze tra
SnakeEyes2 e Die. Se proprio si vuole accedere ai singoli oggetti 
rimangono cmq i metodi getDie.
public class PairOfDice {
    private Die die1;
    private Die die2;
    private int pairValue;
    public PairOfDice() {
        die1 = new Die(6);
        die2 = new Die(6);
    }
    public int roll()
    {
        pairValue = die1.roll() + die2.roll();
        return pairValue;
    }
 
    public int getPairValue()
    {
        return pairValue;    
    }
 
    public Die getDie1()
    {
	return die1;
    }
    public Die getDie2()
    {
	return die2;
    }
}
public class SnakeEyes2 {
    public static void main (String[] args) {
        final int ROLLS = 250;
        int doppi6 = 0;
        PairOfDice pair = new PairOfDice();
        for (int roll = 1; roll <= ROLLS; roll++) {
            int totale = pair.roll();
            System.out.println ("ho fatto: " + totale);
            if (totale == 12)
                doppi6++;
        }
        System.out.println ("ho fatto " + doppi6+" volte doppi 6 ");
    }
}
ciaociao

...

giuroche nel week end guardo, grazie