Bonjour à tous,
J'ai un problème de modélisation: mon but (pour illustrer mon problème) est de modéliser les déplacements quotidiens d'une population de personnes à travers le réseau routier et ferroviaire d'une agglomération. J'ai donc deux classes (il m'en faudrait plus pour le problème ci dessus mais je vais me focaliser sur ces deux là): une classe personne et une classe train. Chaque personne dispose de la liste des trains quelle peut emprunter pour arriver à son travail. Je voudrais maintenant modéliser la possible suppression d'un train et un principe de notification (un peu comme il se pratique lors de grève avec l'envoi de sms par la sncf) aux usagés (ou client c'est comme vous voulez). Actuellement, j'ai tendance à procéder de la manière suivante:
Je vous ai mis ici les méthodes principales permettant de gérer la mise à jour des trains candidats d'une personne lors de la suppression d'un train. Alors voilà, ça marche mais il faut reconnaitre que le risque de ne pas mettre à jour correctement les listes des personnes ou des trains n'est pas forcément négligeable; de plus cette modélisation impose un couplage fort entre les personnes et les trains (il me parrait cohérent qu'une personne connaisse la liste des trains quelle peut emprunter par contre il me parait beaucoup plus douteux qu'un train ait connaissance des ses possible passagers). Enfin dernier point "négatif", cette modélisation fait usage de pointeurs "bruts" qui sont assez décriés ici. Donc voilà je voulais savoir si vous aviez une idée pour palier aux problèmes que je viens d'évoquer et donc de permettre un couplage moins fort et si possible sans utilisation de pointeurs "bruts". Merci à vous.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 class Personne { std::set<Train*> trainsPossibles; public: ~Personne() { BOOST_FOREACH(Train* t, trainsPossibles) t->remove(*this); } void add(Train& t) { if (trainsPossibles.find(&t) != trainsPossibles.end()) return; trainsPossibles.insert(&t); t.add(*this); } void remove(Train& t) { if (trainsPossibles.find(&t) == trainsPossibles.end()) return; trainsPossibles.erase(&t); t.remove(*this); } }; class Train { std::set<Personne*> personnesCandidates; public: ~Train() { BOOST_FOREACH(Personne* p, personnesCandidates) p->remove(*this); } void add(Personne& p) { if (personnesCandidates.find(&p) != personnesCandidates.end()) return; personnesCandidates.insert(&p); p.add(*this); } void remove(Personne& p) { if (personnesCandidates.find(&p) == personnesCandidates.end()) return; personnesCandidates.erase(&p); p.remove(*this); } };
Partager