Che è “meglio” pratica? Passando riferimenti oggetto o il metodo oggetto riferimenti in Python
-
09-10-2019 - |
Domanda
Sto scrivendo un piccolo pezzo di codice in Python e sono curioso cosa pensano gli altri di questo.
Ho un paio di classi, ciascuna con alcuni metodi, e sto cercando di determinare ciò che è "meglio": per passare gli oggetti attraverso chiamate di metodo, o di passare metodi attraverso chiamate di metodo quando è necessario un solo metodo da un oggetto. In sostanza, devo fare questo:
def do_something(self, x, y, manipulator):
self.my_value = manipulator.process(x, y)
o del presente
def do_the_same_thing_but_differently(self, x, y, manipulation):
self.my_value = manipulation(x, y)
Il modo di vedere, il secondo è probabilmente "meglio" perché favorisce anche più flessibile di aggancio / forte coesione tra la manipolazione e l'altra classe. Sono curioso di vedere alcuni argomenti a favore e contro questo approccio per i casi in cui solo un singolo metodo è necessario da un oggetto.
Modifica Ho rimosso la formulazione OOP perché era chiaramente sconvolgente. Sono stato principalmente riferendo di accoppiamento lasco ed elevata coesione.
Soluzione
La seconda soluzione può fornire accoppiamento più flessibile perché è più "funzionale", non più "OOP". La prima soluzione ha il vantaggio che funziona in linguaggi come C ++, che non hanno le chiusure (anche se si può ottenere un effetto simile utilizzando modelli e puntatore-a-membro-funzioni); ma in un linguaggio come Python, IMHO la seconda alternativa sembra essere più "naturale".
EDIT: troverete una bella discussione di "oggetto vs funzionale oriented" tecniche nel libro gratuito "ordine superiore Perl", disponibile qui:
(sguardo nel capitolo 1, parte 6). Anche se è un Perl (e non un Python) libro, la discussione non si adatta esattamente alla domanda posta qui, e le tecniche funzionali descritte non possono essere applicate a Python in un modo simile.
Altri suggerimenti
Devo dire che il secondo approccio; perché è sicuramente l'aspetto di un callback cui sono molto utilizzati quando si utilizza il Hollywood principio (non chiamateci chiameremo voi), che è un paradigma che aiuta nello sviluppo di codice con alta coesione e basso accoppiamento [Ref 2 ].
I sarebbe sicuramente andare con il secondo approccio.
Anche considerare che è possibile modificare l'interfaccia di qualsiasi classe Manipolatore in modo che process
è invece scritto __call__
, e allora funzionerà in modo trasparente con il secondo approccio.