Domanda

Come decidete voi ragazzi tra tenere traccia di qualcosa localmente e poi passarlo a tutti i metodi che chiamate, o dichiarare una variabile di istanza e usarla nei metodi?

Tendo a preferire le variabili di istanza mantenute in un elenco alla fine della Classe. Ma man mano che i miei programmi diventano sempre più complicati, questo elenco diventa sempre più lungo ... Immagino che se qualcosa viene superato abbastanza spesso dovrebbe essere visibile a tutti i ragazzi e le ragazze che ne hanno bisogno, ma poi inizio a chiedermi, " perché non rendere tutto pubblico! Quindi non sarà più necessario passare nulla! & Quot;

È stato utile?

Soluzione

Dato che ti riferisci alle variabili di istanza, suppongo che tu stia lavorando in un linguaggio orientato agli oggetti. In una certa misura, quando usare le variabili di istanza, come definirne l'ambito e quando usare le variabili locali è soggettivo, ma ci sono un paio di regole pratiche che puoi seguire ogni volta che crei le tue classi.

  • Le variabili di istanza sono generalmente considerate attributi di una classe. Pensa a questi come aggettivi dell'oggetto che verrà creato dalla tua classe. Se i dati dell'istanza possono essere utilizzati per aiutare a descrivere l'oggetto, è probabilmente sicuro scommettere che è una buona scelta per i dati dell'istanza.

  • Le variabili locali sono utilizzate nell'ambito dei metodi per aiutarli a completare il loro lavoro. Di solito, un metodo dovrebbe avere lo scopo di ottenere alcuni dati, restituire alcuni dati e / o elaborare / eseguendo un algoritmo su alcuni dati. A volte, aiuta a pensare alle variabili locali come a modi per aiutare un metodo ad arrivare dall'inizio alla fine.

  • L'ambito della variabile di istanza non è solo per la sicurezza, ma anche per l'incapsulamento. Non dare per scontato che l'obiettivo di " dovrebbe essere quello di mantenere tutte le variabili private. " In caso di ereditarietà, rendere le variabili protette è di solito una buona alternativa. Invece di contrassegnare tutti i dati di istanza come pubblici, crei getter / setter per coloro che devono accedere al mondo esterno. Non renderli tutti disponibili - solo quelli di cui hai bisogno. Questo avverrà durante il ciclo di vita dello sviluppo - è difficile indovinarlo fin dall'inizio.

Quando si tratta di passare i dati in una classe, è difficile dire che cosa stai facendo è una buona pratica senza vedere del codice. A volte, operare direttamente sui dati dell'istanza va bene; altre volte no. Secondo me, questo è qualcosa che viene dall'esperienza: svilupperai un po 'di intuizione man mano che le tue abilità di pensiero orientate agli oggetti migliorano.

Altri suggerimenti

Principalmente ciò dipende dalla durata dei dati archiviati nella variabile. Se i dati vengono utilizzati solo durante un calcolo, passarli come parametro. Se i dati sono legati alla durata dell'oggetto utilizzare una variabile di istanza.

Quando il tuo elenco di variabili diventa troppo lungo, forse è un buon punto di pensare al refactoring di alcune parti della classe in una nuova classe.

A mio avviso, le variabili di istanza sono necessarie solo quando i dati verranno utilizzati tra le chiamate.

Ecco un esempio:

myCircle = myDrawing.drawCircle(center, radius);

Ora consente l'imaging della classe myDrawing che utilizza 15 funzioni di supporto per creare l'oggetto myCircle e ciascuna di queste funzioni avrà bisogno del centro e del raggio. Non dovrebbero comunque essere impostati come variabili di istanza della classe myDrawing. Perché non saranno più necessari.

D'altra parte, la classe myCircle dovrà memorizzare sia il centro che il raggio come variabili di istanza.

myCircle.move(newCenter);
myCircle.resize(newRadius);

Affinché l'oggetto myCircle sappia qual è il raggio e il centro quando vengono effettuate queste nuove chiamate, devono essere archiviate come variabili di istanza, non solo passate alle funzioni che ne hanno bisogno.

Quindi, in sostanza, le variabili di istanza sono un modo per salvare lo stato " di un oggetto. Se una variabile non è necessaria per conoscere lo stato di un oggetto, non dovrebbe essere una variabile di istanza.

E per rendere tutto pubblico. Potrebbe semplificarti la vita in questo momento. Ma tornerà a perseguitarti. Per favore, no.

IMHO:

Se la variabile fa parte dello stato dell'istanza, allora dovrebbe essere una variabile di istanza - variabile di istanza HAS-A di classe.

Se mi trovassi a passare ripetutamente qualcosa nei metodi di un'istanza, o trovassi che avevo un gran numero di variabili di istanza, probabilmente avrei provato a guardare il mio progetto nel caso in cui avessi perso qualcosa o fatto una cattiva astrazione da qualche parte .

Spero che sia d'aiuto

Ovviamente è facile tenere un grande elenco di variabili pubbliche nella classe. Ma anche intuitivamente, puoi dire che questa non è la strada da percorrere.

Definisci ogni variabile subito prima di usarla. Se una variabile supporta la funzione di un metodo specifico, utilizzarla solo nell'ambito del metodo.

Pensa anche alla sicurezza, una variabile di classe pubblica è suscettibile di modifiche indesiderate da " outside " codice. Il tuo obiettivo principale dovrebbe essere quello di mantenere tutte le variabili private, e ogni variabile che non lo è, dovrebbe avere un'ottima ragione per esserlo.

A proposito del passaggio dei parametri su tutta la pila, questo può diventare brutto molto velocemente. Una regola empirica è mantenere le firme del metodo pulite ed eleganti. Se vedi molti metodi che utilizzano gli stessi dati, decidi se è abbastanza importante essere un membro della classe e, in caso contrario, refatta il tuo codice per renderlo più sensato.

Si riduce al buon senso. Pensa esattamente dove e perché stai dichiarando ogni nuova variabile, quale dovrebbe essere la sua funzione e da lì prendi una decisione in merito a quale ambito dovrebbe vivere.

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