Je trouve la combinaison de syntaxe orientée objet this.method()
et procédurale / fonctionnelle de Python method(this)
très dérangeante:
x = [0, 1, 2, 3, 4]
x.count(1)
len(x)
any(x)
x.reverse()
reversed(x)
x.sort()
sorted(x)
Cela est particulièrement grave car un grand nombre de fonctions (plutôt que de méthodes) sont simplement vidées dans l’ espace de noms global : méthodes relatives aux listes, chaînes, nombres, constructeurs, métaprogrammation, toutes mélangées dans une grande liste triée par ordre alphabétique.
À tout le moins, les langages fonctionnels comme F # ont toutes les fonctions correctement espacées dans les modules:
List.map(x)
List.reversed(x)
List.any(x)
Donc, ils ne sont pas tous ensemble. De plus, il s'agit d'une norme suivie dans toute la bibliothèque, donc au moins elle est cohérente.
Je comprends les raisons de faire la fonction fonction vs méthode , mais je pense toujours que c'est une mauvaise idée de les mélanger comme ça. Je serais beaucoup plus heureux si la méthode-syntaxe était suivie, du moins pour les opérations courantes:
x.count(1)
x.len()
x.any()
x.reverse()
x.reversed()
x.sort()
x.sorted()
Que les méthodes mutent ou non, les avoir comme méthodes sur l'objet présente plusieurs avantages:
- Emplacement unique pour rechercher les opérations "communes" sur un type de données: autres bibliothèques / etc. peuvent avoir d'autres choses fantaisistes à faire avec les types de données mais les opérations "par défaut" sont toutes dans les méthodes de l'objet.
- Pas besoin de continuer à répéter
Module
lorsque vous appelez Module.method(x)
. En prenant l'exemple de la liste fonctionnelle ci-dessus, pourquoi dois-je continuer à répéter List
encore et encore? Il faut savoir que c'est un List
et je ne veux pas appeler la Navigation.map()
fonction dessus! En utilisant la x.map()
syntaxe, cela reste sec et toujours non ambigu.
Et bien sûr, cela présente des avantages par rapport à la manière de tout mettre en place dans un espace de noms global . Ce n'est pas que la manière actuelle est incapable de faire avancer les choses. C'est même assez concis ( len(lst)
), puisque rien n'est espacé! Je comprends les avantages d'utiliser des fonctions (comportement par défaut, etc.) par rapport aux méthodes, mais je ne l'aime toujours pas.
C'est juste en désordre. Et dans les grands projets, le désordre est votre pire ennemi.