Forum Clubic

[POO ou UML?] - je pense que c une question d'agrégat?

Bon, pour vous expliquer le pb, je vais vous donner un exmple. (désolé s’il est stupide mais rien que ca, j’ai eut du mal à le trouver :slight_smile: )

J’ai des personnes, et chaque personne posséde un super appareil electronique revolutionnaire, qui, en fonction d’une goute de sang de la personne, son age, et sa couleur de cheuveux lui donne une note sur une echelle variable qui correpond a son echelle de bonheur.
(oui oui, c’est completement stupide :slight_smile: )

Voila a koi ressemblerait ma classe en gros:


class Personne{

	private age;
	private groupe_sanguin;
	private couleur_cheuveux;
	
	private monBonheurTesteur;
	
	Personne(){
  monBonheurTesteur = new BonheurTesteur();
	}
}


class BonheurTesteur{

	private echelleLevel;
	
	public getBonheurLevel(){
  
  //la y a un bout de code qui, pour calculer le niveau du bonheur, a besoin de connaitre 
  //l'echelle dans lequelle l'appareil va donner la reponse, ainsi que l'age, le groupe 
  //sanguin et la couleur des cheuveux de la personne qui possede ce fantastique appareil.  
	}

}

Bon disons que j’instancie 2 personnes

bonhomme A
age = 30;
groupe_sanguin=A;
couleur_cheuveux=noir;
(il regle sa machine pour avoir la note représenté sur une echelle de 10)

bonhomme B
age = 20;
groupe_sanguin=O;
couleur_cheuveux=roux;¸
(il regle sa machine pour avoir la note représenté sur une echelle de 20)

Voila (enfin) ma question:

Le constructeur de personne creer l’objet BonheurTesteur.
Pour pouvoir utiliser la methode getBonheurLevel, l’objet BonheurTesteur a besoin des données qui sont contenu dans le bonhomme.
Mais vu que la l’objet BonheurTesteur se trouve DANS l’objet personne, il peut pas les lires lui meme.
Je vais donc etre obligé de: soit lui envoyé en parametre dans lors de l’apelle du constructeur, soit de carrement lui envoyé l’objet personne (ou une réference).
Et je ne trouve pas ca tres logique VU que l’objet BonheurTesteur est a l’interieur de l’objet personne!
Voila, donc j’aimerais connaitre l’avis de certains afin de connaitre qu’elle est la meilleur methode.
Un ami m’a parlé d’utiliser le design pattern Visitor. Mais comme mes connaissance ne sont pas si bonne que ca dans la matiere, apres de nombreuse recherche sur ce design pattern, je n’arrive plus a voir l’interet dans mon cas.

Merci a vous qui avez lu jusqu’au bout :slight_smile:

Bonne journée/soirée a vous.

Je parle pas tellement du C++, mais plus de la prog objet en général : mais ça serait pas plus logique si ta classe BonheurTesteur étendait (ou complétait) la classe Personne ? Ainsi, tu passerais tes propriétés private en protected et tu y aurais accès.

Personnelement je trouverais moins logique de faire ce que tu me proposes, meme si ca marcherait.
Mais je me trompe peut etre :slight_smile: C’est pour ca que je pose la question sur le forum.
D’autre personne peuvent-ils donner leur avis svp?

En tout cas merci encore sans-nom :stuck_out_tongue:

sans-nom a parlé d’un point de vue pragmatique, et sa solution est OK, mais puisque tu parle d’un point de vue conceptuel (ce qui se défend aussi):
il est logique que ton objet BonheurTesteur connaisse la classe Personne, en revanche que la classe Personne connaisse la classe Bonheur ne sert à rien (Toute les personnes ne sont pas censée connaître le bonheur hum désolé). Comme ça tes classes dépendent moins les unes des autres, car pour moi c’est ça la préoccupation d’un bon design.
donc getBonheurLevel() prend en paramètre une personne, c’est à la limite un Singleton, si tu tiens à utiliser un pattern.

Ceci dit pour les Pattern, j’ai mon point de vue, il ne faut pas en abuser, il faut d’abord se roder à ses propres design, et avec l’expérience, les évaluer par comparaison au patterns pour voir s’il sont logiques.
Le pattern Visitor, je l’ai vu implémenté, c’est super complexe si on cherche à en tirer parti, et même en connaissant son fonctionnement, je trouve ça imbouffable à lire. Donc mauvaise maintenance, donc mauvais design (s’il est employé à tort hein).

Quand au pattern Visitor, j’en rajoute une couche:
“Le pattern Visitor, c’est tabou
on en viendra tous à bout”

Ok merci bcp pour tes conseils, je vois ce que tu veux dire. C’est que, comme tu le dis, tout le monde n’a pas le droit au bonheur :slight_smile: Et que donc, ca parait un peu bête que toute les personnes possèdent un objet bonheurTesteur meme si sa reference est NULL.

Je pense que je vais tout simplement l’enlever de la classe personne. Mais si je fais ca, comment faire le lien entre une personne et son bonheur testeur? je comprend que le bonheurTesteur va connaitre la personne vu qu’il va prendre une personne en parametre, mais comme la personne va savoir qu’elle possede un bonheurTesteur?
Il va falloir parcourir tous les elements bonheurTesteur?

Au lieu de référencer les personnes pour rechercher le niveau, tu ne peux pas référencer directement le score?
Tu fait une nouvelle classe BonheurLevel qui contient un score et une personne, et ta classe bonheurTester te permet de créer ces BonheurLevel. et pour moi, il n’y a qu’un instance de BonheurTesteur.
Et si vraiment tu veux retrouver un score en fonction d’une personne, utilise une HashMap, comme ça pas besoin de parcourir toute une liste. :wink:

Implémente bien les méthodes equals et hashcode de la classe Personne pour que ta hashmap fonctionne bien, ou alors fait le lien par le nom de personne si c’est identifiant. :slight_smile: