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.

È stato utile?

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:

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

(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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top