Débutant, moyenne, avis - Java - Programmation
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).
Marsh Posté le 07-03-2015 à 12:36:37
Salut,
Merci, ça va prendre un peu de temps mais je répondrai encore.
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
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) :
Tout les commentaires sont bienvenus.
Merci.