Ruby - quando utilizzare le variabili di istanza vs i parametri tra i metodi?

8

Sto scrivendo diversi metodi che chiamano altri metodi.

Per passare le informazioni ho un paio di scelte:

  1. Passa le informazioni come parametri

  2. Imposta le variabili di istanza in modo che altri metodi possano accedervi

Quando dovrei scegliere un'opzione rispetto all'altra?

Sembra che la prima opzione sia buona in quanto è molto specifica su ciò che viene passato. il lato negativo sembra essere che molti valori vengono passati in giro.

Il secondo metodo non richiede il passaggio di tutti i valori intorno, ma sembra portare a un sacco di magia in cui i metodi impostano le variabili di istanza "da qualche parte"

Dovrei essere sempre molto esplicito riguardo al passaggio ad altri metodi nella classe? Ci sono eccezioni quindi?

    
posta Michael Durrant 18.10.2013 - 16:55
fonte

2 risposte

11

Dipende dal ruolo di quelle variabili rispetto all'intera classe .

Se la tua classe è piccola e le informazioni che queste variabili trasportano sono rilevanti per tutto o quasi tutte, allora ha senso averle come variabili di istanza. Un oggetto di conto bancario probabilmente ha bisogno di conoscere il suo titolare per la maggior parte delle azioni comunque, quindi ha senso tenerlo per un tempo indefinito.

Se i dati sono molto specifici di questo metodo e dei suoi aiutanti, allora dovrebbero viaggiare come parametri. La data di una transazione non è tanto una caratteristica dell'account quanto una singola azione intrapresa su quell'account. (Se hai più di uno di questi parametri e tendono ad essere trasmessi come unità (es. Data, ora del giorno e fuso orario), allora è anche saggio raggrupparli in un oggetto helper per mantenere numero di parametri giù.)

    
risposta data 18.10.2013 - 17:01
fonte
13

Lascia che ti indico in modo errato per chiarire il mio punto di vista:

I'm writing several functions that call other functions. To pass the information I have two choices:

  1. Pass the info as arguments.
  2. Use global variables.

When should I choose one option over the other?

È generalmente riconosciuto che lo stato non locale è una cattiva idea. Di conseguenza, dovresti generalmente passare le informazioni utilizzando i parametri, non tramite variabili in un ambito comune. Questo diventa più gestibile se raggruppate le informazioni correlate in oggetti o strutture.

Il passaggio di troppi parametri è un odore di codice, e può probabilmente essere rifattorizzato per usare qualche altra classe. Assumi un caso patologico in cui stai scrivendo una rubrica e hai un metodo add_contact(surname, firstname, fullname, ...) . Sarebbe meglio raggrupparlo in una classe Name , allo stesso modo per parti di un indirizzo: add_contact(name, address) .

Se tuttavia i parametri necessari alla tua funzione non sono completamente correlati, è possibile che il tuo metodo stia cercando di fare troppo e dovrebbe essere rifatto in parti più piccole.

Non penso che usare le variabili di istanza sia una buona soluzione: è una mutazione di stato inutile, e porta con sé tutti i problemi delle variabili globali, su una scala più piccola. In questo modo si trova codice spaghetti non debugabile.

    
risposta data 18.10.2013 - 17:13
fonte

Leggi altre domande sui tag