Oui, les methodes statiques existent en C++, elles sont comme les methodes Delphi je crois (c'est a dire des fonctions libres mais dans un namespace)
il y a deux ecoles differentes dans la STL, la premiere est dans le fichier <algorithm> en général : par exemple, trier un container se fait par une methode externe (std::sort(begin(), end(), comparateur) et n'est pas membre d'un container en particulier.
La deuxieme est dans <string> ou les methodes
insert
append
remove
replace
find/rfind (<=== surtout celle la)
compare
sont des membres non statique de la classe std::string
c'est considéré comme une mauvaise idée de polluer l'interface de string avec des choses qui peuvent etre exterieures, un peu comme de mettre des choses publiques dans une classe au lieu de protected ou private, ou de faire de l'heritage public systematiquement.
find() peut etre ecrite de la meme maniere en sortant la methode de la classe et en la laissant travailler avec l'interface publique.
C'est un anti-pattern connu sous le nom de God object ou Blob (http://en.wikipedia.org/wiki/God_object)
pour plus d'info sur les anti pattern, voir http://en.wikipedia.org/wiki/Anti-pattern (en anglais desole)
screetch dit : (c'est a dire des fonctions libres mais dans un namespace)
Pas vraiment, elles ne sont pas dans un namespace mais déclarées dans la déclaration de la classe. Elles ne travaillent pas sur l'objet en lui-même mais sur la classe de l'objet. Mais si on n'utilise pas les propriétés de la classe dans l'implémentation de la méthode statique, cela revient au même qu'une fonction libre dans un namespace.
screetch dit : sont des membres non statique de la classe std::string
Ne sont-ce pas des méthodes et non des membres ? Tu veux dire qu'ils ont définit ces méthodes comme étant des méthodes non statiques travaillant directement sur l'objet ?
Veux-tu dire que ce qu'ils avaient fait, c'est mettre trop de fonctions dans le namespace et qu'ils ont préféré les mettre dans un autre namespace ? Si c'est ça, je ne comprends pas.
Ou bien, veux-tu dire qu'ils ont changé les méthodes de la classe en fonctions inclues dans le namespace ? Et dans ce cas, je trouve ça normal.
Au sujet du God object, je pense que l'important n'est pas de compter le nombre de champs et de méthodes de l'objet mais bien de voir la conhérence des données et des méthodes. Ils n'ont pas vraiment insisté sur ce point.
On ne peut pas couper en 2 une classe juste parce qu'elle est trop grosse alors que les données doivent être ensemble.
Mais il est vrai, à l'inversement, que des gens font un super objet qui gère toute l'application alors qu'ils devraient donner le travail et les responsabilités aux classes suivant leurs rôles.
__________________________
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].
je voulais dire par la que les fonctions append, remove, replace, find et toute leurs petites oeurs sont des methodes de la classe string, alors que l'interface (sans ces methodes) de la classe string permet d'effectuer ces operations. Donc ces methodes auraient pu etre des fonctions libre, comme std::sort()
par "membres" je voulais dire "fonction membre" au contraire de "fonction libre" :)
en gros au lieu de faire
std::string hopla ("hopla");
hopla.find("la");
beaucoup pensent qu'il faudrait faire
std::string hopla ("hopla");
std::find(hopla, "la");
de meme pour beaucoup de methodes de string qui devraient etre des fonctions libres (ou statique de string)
Pour des classes comme std::string (enfin std::basic_string), il faudrait alléger l'interface, car c'est un objet à sémantique de valeur, on doit le manipuler "comme un type fondamental"...
Cependant, pour un widget d'interfaces graphiques, je me vois mal faire 100 lignes de ce genre :