avec mon collègue nous nous posons un problème métaphysique pour lequel nous avons 2 solutions qui marchent toutes les 2. Le hic c'est que nous n'arrivons pas à savoir quelle philosophie est la bonne en POO.
Voici le problème :
2 classes Gamme et Famille.
Une Gamme comprend 0 ou N Familles.
On veut pouvoir :
* besoin1 : lister les familles d'une gamme
* besoin2 : récupérer la gamme d'une famille
1ère solution :
* La classe Gamme implémente une méthode ListerFamilles qui retourne la collection de Familles de l'instance Gamme appelante => besoin1 satisfait
* La classe Famille a une méthode RecupGamme qui renvoie une instance de Gamme de l'instance de Famille appelante => besoin2 satisfait
2ème solution :
* La classe Famille implémente une méthode ListerFamilles, ayant un paramètre Gamme, qui retourne une collection de Familles => besoin1 satisfait
* La classe Gamme code une méthode RecupGamme, ayant un paramètre Famille, qui retourne une Gamme => besoin2 satisfait
Je pense que les 2 solutions marchent. Mais ce que je cherche à savoir c'est quelle est la bonne manière de faire en POO ?
Est-ce la solution1 qui est mieux ?
ou bien la solution2 ?
et surtout pour quelles raisons l'une est mieux que l'autre ?
Une autre solution3 existe-t-elle ?
Personnellement, je pense que c'est la solution1 qui est la bonne en POO mais comme je me trompe souvent...
Je pense, par simple logique, que la solution 1 est meilleure...
Je m'explique :
Pour récupérer la Gamme d'une famille, ben la fonction doit être membre de la famille en question...logiquement, non? Et dans chaque famille, il y aura un attribut de type Gamme, et une fonction Famille.getGamme().
Ensuite, lorsque l'on crééra une gamme, et des familles ayant comme gamme cette dernière.
Il est plus logique de faire Gamme.listFamilles() sachant que la class Gamme aurait un tableau dynamique contenant les familles.
Cependant cela reste mon avis personnel
Il me semble aussi que la premiere solution est plus logique.
Cela implique par contre deux choses :
- il faut que dans ton instance de famille tu es defini de quel gamme elle fait partie.
- il faut egalement que chaque gamme puisse savoir quel famille lui est lié.
Personnellement je compliquerais peut etre un peu les choses, mais je ferais un truc dans le genre :
[quote]
class gammes :
liste des variables :
nom = contient le nom de la gamme
familles = un tableau contenant des references vers les instances de familles liées.
liste des methodes :
get_nom() = retourne le nom de la gamme
liste_familles() = fait une boucle sur la liste de famille, et appel la methode get_name de chacune des familles
[/quote]
[quote]
class familles
liste des variables :
nom = contient le nom de la famille
gamme = contient une reference vers l'instance de gamme liée.
liste des methodes :
get_nom() = retourne le nom de la famille
get_gamme() = appel la fonction get_nom de la gamme et le retourne.
get_liste_famille() = appel la fonction liste famille de la gamme.
[/quote]
moi en tout cas j'ferais comme ca. la derniere methode de la classe famille permet d'avoir acces aux deux besoins depuis une famille ou depuis une gamme, peu importe.
Bon allez je tente. La question est extrêmement intéressante et j'espère que je ne vais pas me planter.
Si j'ai bien compris :
- une famille se trouve dans une gamme est une seule
- une gamme peut comprendre de 0 à N familles.
Je fais l'hypothèse qu'il y a un besoin de persistance, (comme c'est le cas dans beaucoup d'applications) c'est à dire de sauvagarder dans des fichiers ou dans une base de données la liste des gammes et des familles.
Je pense qu'il faut associer à chaque gamme un identifiant (id) qui est unique et qui permet de répérer une gamme. cet identifiant est conservé même après sa sauvegarde.
Je mettrais un champs id dans la classe gamme permettant d'identifier la gamme.
je mettrais un champs is dans la gamme ce qui permet d'identifier la gamme dans laqueklle se trouve la famille.
Je créerais une classe liste_gammes dans laquelle je mettrais toute mes gammes ainsi qu'une classe liste_familles dans laquelle je mettrais toutes mes familles.
Dans la classe liste_gamme, il y aurais une méthode recherche_id qui permettrais de retrouver une gamme portant un certain id. (besoin 2).
Dans la classe liste_famille, il y aurait une méthode get_liste_Familles qui permettrait de récupérer la liste des familles portant un certain id (besoin 1).
Cette solution permet d'assurer la persistance sans difficulté.
Elle présente l'inconvénient s'il y a beaucoup de gammes ou de familles d'être longue pour les méthodes get_liste_Familles et recherche_id.
Si cela est trop gênant, alors il faut associer en plus sur chaque instance d'une gamme une liste de références vers des familles qui doit être mise à jour à chaque création ou destruction d'une famille.
Il faudra associer également à chaque instance d'une famille une référence vers la gamme dans laquelle elle se situe.
S'il n'y a aucun besoin de persistance, alors, on peut supprimer le id et se contenter d'implémenter le dernier point.
En résumé :
- s'il y a besoin de persistance : une variante de la solution 2
- s'il y a besoin de performances et pas de persistances une variante de la solution 1.
- S'il y a besoin des 2, alors on mixe les 2. C'est la solution que j'ai exposée.
Oui, ce serait un peu le système qu'on peut utiliser pour organiser des base de données, lier différent types etc...
Alp
__________________________
Be C++ Mon Blog (C++, Intelligence Artificielle, Prolog)
Salut, je suis un peu fatigué, désolé, j'ai suivi vos idées et la mienne doit ressembler aux votres.
Si les familles ne peuvent pas exister sans Gamme, autant faire une Gamme qui possède une liste de famille, et quand on crée une famille, on fait une référence vers la Gamme qui en est propriétaire. Donc un champ référence vers la Gamme dans l'objet famille.
Si les familles doivent exister indépendament des Gammes dans ce cas, fait une liste de références dans Gamme qui vont pointer ves les familles et dans la famille avoir une référence vers la Gamme.
En fait pour savoir comment le faire, il faut voir comment les objets vont interagir et s'il y en a qui sont de nature à être propriétaires d'autres.
Le mieux (pour moi) est de structurer les objets de façon à calquer au mieux la réalité.
Et aussi, tout dépend du langage utilisé car les solutions divergeront un petit peu d'un langage à l'autre. Par exemple, en Pascal, les objets ont une propriété Owner qui référence le propriétaire qui est définit à la création. C'est ce proprio qui est responsable de la destruction de l'objet.
__________________________
Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
N'oubliez pas le Tag [Résolu].
Finalement, je ne suis plus sûr d'être totalement d'accord.
Ce qui me gêne c'est que dans la classe Famille on se trimbale une référence sur sa Gamme... alors qu'une famille peut exister toute seule sans sa gamme.
Je m'explique. Vu qu'on a une méthode Get_Gamme dans la classe Famille qui retourne un objet Gamme, quel est l'intérêt d'un attribut dans la classe Famille qui soit une référence sur sa Gamme ?
L'utilité de cette référence n'est-elle pas liée uniquement à une facilité d'écriture de code ? En effet, il est plus simple d'écrire :
maFamille.GammeMere
que d'écrire :
maGamme = new maFamille.Get_Gamme()
En pure POO (je vous avais prévenu que c'était métaphysique ), je pense qu'on peut se limiter à :
Classe Gamme
attribut privé liste de références Familles
méthode publique Get_Liste_Famille
Classe Famille
méthode publique Get_Gamme qui retourne un objet de type Gamme
Et comment est-ce que la méthode Get_Gamme() retournera la Gamme de la famille, sans qu'il y ait une référence à cette gamme. ..?
Alp
__________________________
Be C++ Mon Blog (C++, Intelligence Artificielle, Prolog)