2 votes

Quelle est la "meilleure" pratique ? Passer des références d'objet ou des références de méthode d'objet en Python

Je suis en train d'écrire un petit bout de code en Python et je suis curieux de savoir ce que les autres en pensent.

J'ai quelques classes, chacune avec quelques méthodes, et j'essaie de déterminer ce qui est "mieux" : passer les objets par des appels de méthode, ou passer les méthodes par des appels de méthode quand une seule méthode d'un objet est nécessaire. En gros, devrais-je faire ceci :

def do_something(self, x, y, manipulator):
    self.my_value = manipulator.process(x, y)

ou ceci

def do_the_same_thing_but_differently(self, x, y, manipulation):
    self.my_value = manipulation(x, y)

De mon point de vue, la seconde est sans doute "meilleure" car elle favorise un couplage encore plus lâche/une cohésion plus forte entre la manipulation et l'autre classe. Je suis curieux de voir les arguments pour et contre cette approche pour les cas où une seule méthode est nécessaire pour un objet.

EDITAR: J'ai supprimé la formulation OOP parce qu'elle était clairement dérangeante. Je faisais surtout référence au couplage lâche et à la cohésion élevée.

4voto

Doc Brown Points 13438

La deuxième solution peut offrir un couplage plus lâche parce qu'elle est plus "fonctionnelle" et non plus "POO". La première solution a l'avantage de fonctionner dans des langages comme le C++ qui n'ont pas de closures (bien que l'on puisse obtenir un effet similaire en utilisant des templates et des fonctions de type pointeur à membre) ; mais dans un langage comme Python, la deuxième solution semble plus "naturelle".

EDIT : vous trouverez une très bonne discussion sur les techniques "fonctionnelles vs. orientées objet" dans le livre gratuit "Higher order Perl", disponible ici :

http://hop.perl.plover.com/

(voir le chapitre 1, partie 6). Bien qu'il s'agisse d'un livre sur Perl (et non sur Python), la discussion correspond exactement à la question posée ici, et les techniques fonctionnelles qui y sont décrites peuvent être appliquées à Python de manière similaire.

1voto

mouad Points 21520

Je dirais la deuxième approche, parce que ça ressemble vraiment à un rappel qui sont très utilisés lors de l'utilisation de l Le principe d'Hollywood (ne nous appelez pas, nous vous appellerons) qui est un paradigme qui aide au développement d'un code à forte cohésion et à faible couplage [Réf. 2 ] .

0voto

Karl Knechtel Points 24349

Je choisirais définitivement la deuxième approche.

Considérez également que vous pourriez changer l'interface de n'importe quelle classe de Manipulateur afin que process s'écrit plutôt __call__ et il fonctionnera ensuite de manière transparente avec la deuxième approche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X