Bonjour suite à cette discutions :
http://www.developpez.net/forums/d79...lacant-switch/
je créé ce poste pour avoir vos avis. Mon problème est assez simple. J'ai une structure composée de int et string. Je dois pouvoir trier un vecteur en fonction de n'importe quels membres. Un point important, c'est un vecteur utilisé pour de l'ihm et qui sera trié de temps en temps par l'utilisateur. Voulant optimiser un minimum, ma première version est très lourde à relire et donc autant plus complexe à maintenir (d'où mon poste au départ):
fcharton m'as proposé une solution, que je trouve bien plus pertinente par rapport à mon problème. Un simple prédicat avec un paramètre dans le constructeur qui contiendra le switch.
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 switch(m_sortFlag) { case DESCENDINGORDER | IDMAILBOX: qStableSort ( m_internal.begin(), m_internal.end(), std::binary_negate<compareIdMailBox>(compareIdMailBox()) ); break; case ASCENDINGORDER | IDMAILBOX: qStableSort ( m_internal.begin(), m_internal.end(), compareIdMailBox() ); break; case DESCENDINGORDER | IDEMAIL: qStableSort ( m_internal.begin(), m_internal.end(), std::binary_negate<compareIdEmail>(compareIdEmail()) ); break; case ASCENDINGORDER | IDEMAIL: qStableSort ( m_internal.begin(), m_internal.end(), compareIdEmail() ); break; ... }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class Sorter { private: int SortType; public: Sorter(int st) : SortType(st) {} bool operator()(type &t1,type &t2) { switch SortType { case ... : return... } } };
Comparéau code de départ, ce trie sera moins rapide, car le switch sera présent à chaque itération, mais faux problème, car le trie dépend du temps "humain" et donc bien assez rapide pour une iHM et donc un humain. Et surtout, la lisibilité du code et sa maintenance y gagne considérable!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 qStableSort (v.begin(),v.end,Sorter(sorttype));
Comme il est toujours intéressant de confronter les idées,
Êtes vous d'accord avec ce raisonnement? ou trouvez vous cela absurde?
Ou
Dans quelle mesure le C++ moderne peut rend la maintenance plus facile?
![]()
Partager