Débutant, moyenne, avis

Débutant, moyenne, avis - Java - Programmation

Marsh Posté le 05-03-2015 à 12:41:05    

Salut,
 
Je commence en java et pour m'initier j'ai voulu faire un calcul de moyenne pondérée, je voudrais connaitre vos avis concernant la lisibilité, les défauts, l'efficacité etc. de ce bout de code (qui fonctionne) :
 
 

Code :
  1. import java.util.Scanner;
  2. public class moyenne {
  3. /*Pour calculer une moyenne il faut :
  4.  * 1- connaître le nombre de notes, leur valeur et leur coefficients;
  5.  * 4- faire la somme des (notes*coefficients) et faire la somme des coefficients;
  6.  * 6- diviser la somme des notes par la somme des coefficients;
  7.  */
  8. Scanner saisie = new Scanner(System.in); //permet la saisie de données par l'utilisateur
  9. private final int NOMBRE_NOTE_MAX=20; //nombre maximum de notes
  10. private float [] tabNotes = new float[NOMBRE_NOTE_MAX]; //tableau de notes
  11. private float [] tabCoefficients = new float[NOMBRE_NOTE_MAX]; //tableau de coefficients
  12. private float sommeDesNotes = new Float(0.0f);
  13. private float sommeDesCoefficients = new Float(0.0f);
  14. private float moyenne = new Float(0.0f);
  15. private int nbnotes = new Integer(0); //nombre de notes que l'utilisateur veut saisir
  16. public static void main(String[] args) {
  17.  moyenne moy = new moyenne();
  18.  moy.notes();
  19.  moy.calculerSommes();
  20.  moy.calculMoyenne();
  21.  System.out.println("Somme des notes = "+moy.sommeDesNotes);
  22.  System.out.println("Somme des coefficients = "+moy.sommeDesCoefficients);
  23.  System.out.println("La moyenne est de : "+moy.moyenne);
  24. }
  25. public void notes(){ //demande la saisie des notes
  26.  int i = 0;
  27.  while (nbnotes <= 0 || nbnotes > 20) { //demande le nombre de notes à saisir 0<nbnotes<=20
  28.  System.out.println("Combien de notes voulez vous entrer ? (20 maximum)" );
  29.  nbnotes = saisie.nextInt();
  30.  }
  31.  for(i = 0;i < nbnotes;i++) {
  32.   System.out.println("Entrez une note (0<note<20)" );
  33.   tabNotes[i] = saisie.nextFloat();
  34.   System.out.println("Entrez le coefficient correpondant (coefficient > 0)" );
  35.   tabCoefficients[i] = saisie.nextFloat();
  36.  }
  37. }
  38. public void calculerSommes() { //calcule la somme des notes et la somme des coefficients
  39.  int i = 0;
  40.  for(i = 0;i < nbnotes;i++) {
  41.   sommeDesNotes = sommeDesNotes + (tabNotes[i] * tabCoefficients[i]);
  42.   sommeDesCoefficients = sommeDesCoefficients + tabCoefficients[i];
  43.  }
  44. }
  45. public void calculMoyenne() {
  46.  moyenne = sommeDesNotes/sommeDesCoefficients;
  47. }
  48. }


 
Tout les commentaires sont bienvenus.
Merci.  :jap:

Reply

Marsh Posté le 05-03-2015 à 12:41:05   

Reply

Marsh Posté le 05-03-2015 à 20:06:55    

Salut

 

Je suppose que ton truc marche (a vue de nez ca devrait) donc je vais seulement parler de la forme.
Ca m'a l'air tout a fait correct et mon job serait beaucoup plus simple si tout le monde mettait au minimum ce niveau de commentaire.
Maintenant ca fait un bail que je dois plus etre a jour sur le Java donc peut-etre que des ayatollahs du Java vont trouver a redire.

 

Quelques points vite fait:
- public class moyenne { -> traditionnellement, les noms de classes commencent toujours par une majuscule.

 

- private float sommeDesNotes = new Float(0.0f); -> tu peux mettre directement private float sommeDesNotes = 0;. Pareil pour les autres declarations de variables de types primitifs. Absolument aucun impact sur le resultat mais ca simplifie un peu le code.

 

- int i = 0;
 for(i = 0;i < nbnotes;i++) {
-> tu peux mettre directement for(int i = 0;i < nbnotes;i++) {

 

- System.out.println("Somme des notes = "+moy.sommeDesNotes); -> regarder ou modifier directement une variable a l'interieur d'un objet, c'est mal.

 

- apres le decoupage en methodes/objets est un peu bizarre. Typiquement, il y a habituellement deux grandes "approches" en programmation:
1 - la programmation "procedurale" (me souviens meme plus si c'est le bon nom) qui ne s'encombre pas d'objet. Bon en Java tout est objet mais ca s'accomode en declarant des methodes et variables statiques.
2 - la programmation orientee objet: encapsulation, heritage et d'autres trucs dont je me souviens plus parce que ca remonte a longtemps et 99% du temps t'en as rien a branler tant que tu te rappelles de pourquoi c'est la.
La, je trouve ton decoupage "bizarre" parce que tu commences a coder une classe "non statique" et pars donc vers de la POO, sauf qu'au final tu t'en sers comme si tu faisais du procedural, et ca donne un melange des genres un peu batard, sans compter les access aux variables pas du tout POO-compliants. Bon comme je disais au debut, "si ca marche on s'en fout", mais ca pourrait amener des surprises pour des trucs plus complexe.

 

Si tu pars sur de l'objet, tu "devrais":
- creer des methodes get/set pour chaque variable de ton objet qui doit etre modifiee/lue depuis l'exterieur, et ne jamais referencer directement ces variables
- bouger la collecte des donnees en dehors de la classe. L'objet de type Moyenne devrait se foutre d'ou viennent les donnees; tu peux les collecter au clavier ou les lire depuis un ficher, c'est pas son probleme. La classe devrait avoir une methode par laquelle passer les donnees deja collectees et au bon format (ou les passer directement dans le constructeur).
- revoir la portee et/ou le decoupage de tes methodes. Mettons que je veuille utiliser ta classe pour calculer une moyenne. Je vais en creer une instance, lui passer mes donnees (notes et coeffs) et m'attendre a n'avoir qu'a appeler une methode qui me donnera la moyenne. Or la, je dois appeler calculerSommes, puis encore calculMoyenne, et encore il faut que j'appelle le getter pour avoir mon resultat. Pas top; calculerSommes devrait typiquement etre invisible (i.e. la passer private ou protected) puisque c'est du rouage interne, personne ne devrait pouvoir l'appeler de l'"exterieur". En revanche, ca devrait etre appele automatiquement depuis calculMoyenne a la place.

 

Un truc "simple" pour "ameliorer" ca (enfin, si ca t'interesse et que tu trouves pas que je radote) c'est de creer une autre classe de test dans un autre package qui se sert de ta classe pour calculer une moyenne. La tu vas tout de suite voir que "System.out.println("Somme des notes = "+moy.sommeDesNotes);" par exemple ne passe plus.

 

Sinon, si tu pars sur du procedural, tu peux passer toutes tes variables et methodes en static et la c'est OK pour appeler ce que tu veux directement de n'importe ou (vu qu'on peut estimer que les questions de portee entre classes etc on s'en tape en procedural).


Message édité par lasnoufle le 05-03-2015 à 20:08:27

---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 07-03-2015 à 12:36:37    

Salut,
 
Merci, ça va prendre un peu de temps mais je répondrai encore.

Reply

Marsh Posté le 12-03-2015 à 14:42:14    

Je remplacerais les float[] par des ArrayList<Float>
Avantage : pas besoin de savoir à l'avance combien de notes il va y avoir vu que la liste est dynamique et tu peux boucler sur la saisie tant que l'utilisateur n'entre pas une valeur spécifique pour dire qu'il a terminé.
 
Au final, le nombre de notes prises en compte ne dépend plus de limitations techniques mais uniquement de la patience de l'utilisateur qui pourra en saisir 10 000 si ça lui chante :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed