Domande su OOP (programmazione orientata agli oggetti) - pagina 11

 

Vorrei l'opinione di programmatori più esperti su alcune sfumature. Prendere le dichiarazioni delle variabili nelle classi. Per esempio, ho delle variabili nelle classi che sono dichiarate all'interno di diversi metodi di una certa classe. Sono dichiarati in ogni metodo più spesso. Vale la pena farlo, o è meglio dichiararli una volta nella sezione privata e poi usarli?

Penso che sarebbe più logico usare le variabili contatore, se sono usate nei loop, giusto? Dopo tutto, il contatore è esplicitamente impostato su un valore al momento del calcolo, per esempio, se usiamo un ciclo:

for (i = OrdersTotal() - 1; i >= 0; i--)
{

}

In ogni metodo, non sarebbe ragionevole dichiarare una variabile i, perché questo è probabilmente un inutile spreco di memoria sulle celle di memoria. In generale, sono interessato a queste cose.

Questo riguarda non solo i loop ma anche altre opzioni. Ci sono abbastanza variabili diverse che devono essere dichiarate più di una volta, ma hanno lo stesso ruolo... L'unica cosa che vedo è che alcuni di essi dovranno essere azzerati in valore, in modo che non contengano "spazzatura" da operazioni precedenti. È ragionevole farlo o è più facile ridichiarare tale variabile... In generale, mi piacerebbe sentirne parlare dai professionisti.

 
hoz:

Vorrei l'opinione di programmatori più esperti su alcune sfumature. Prendere le dichiarazioni delle variabili nelle classi. Per esempio, ho delle variabili nelle classi che sono dichiarate all'interno di diversi metodi di una certa classe. Sono dichiarati in ogni metodo più spesso. Vale la pena farlo, o è meglio dichiararli una volta nella sezione privata e poi usarli?

Penso che sarebbe più logico usare le variabili contatore, se sono usate nei loop, giusto? Dopo tutto, il contatore è esplicitamente impostato su un valore al momento del calcolo, per esempio, se usiamo un ciclo:

In ogni metodo, non sarebbe ragionevole dichiarare una variabile i, perché questo è probabilmente un inutile spreco di memoria sulle celle di memoria. In generale, sono interessato a queste cose.

Questo riguarda non solo i loop ma anche altre opzioni. Ci sono abbastanza variabili diverse che devono essere dichiarate più di una volta, ma hanno lo stesso ruolo... L'unica cosa che vedo è che alcuni di essi dovranno essere azzerati in valore, in modo che non contengano "spazzatura" da operazioni precedenti. È ragionevole farlo o è più facile ridichiarare tale variabile... In generale, mi piacerebbe sentirne parlare dai professionisti.

Se dovreste farlo o meno dipende dallo scopo della creazione della variabile. Se un'entità è incapsulata da una classe, per esempio un ordine, allora avremo bisogno di variabili definite nella classe per esprimere le sue proprietà, per esempio un biglietto per l'ordine. Queste variabili saranno condivise da tutti i metodi di quella classe per lo stesso oggetto in quella classe.

Se una variabile viene creata per fornire un ciclo all'interno di un metodo, dovrebbe essere definita all'interno del metodo come automatica (cioè senza usare la parola chiave static). In questo caso, anche se un metodo chiama un altro metodo all'interno del proprio ciclo, che ha anch'esso un ciclo, e viene usata la variabile con lo stesso nome, non avrete problemi. Quando si usa una variabile dichiarata in una classe, la variabile sarà sovrascritta nel ciclo del secondo metodo.

Per le variabili automatiche, la memoria viene allocata automaticamente quando la funzione viene inserita e cancellata automaticamente quando viene abbandonata, con un overhead minimo. Inoltre, se le funzioni sono semplici, il compilatore può generare codice che non alloca e libera affatto la memoria automatica.

Salvare celle di memoria di questo tipo era una cosa sensata da fare qualche tempo fa, ma alla fine ha perso il suo significato circa 20 anni fa...

 

C'è una classe. Ha un metodo così semplice, tutto senza marchio, perché stavo cercando dove si trova il bug:

// 1.5 Определяем минимальную разрядность лота. ===========================================================================================
int BaseInfo::LotPrecision()
{
   static int li_LotPrecision = 0;     // устанавливаем минимальную разрядность лота в ноль
   Print ("LotPrecision()_Before: li_LotPrecision = ", li_LotPrecision);
   Print ("LotPrecision()_BeforeCircle: SLots.gd_LotStep = ", SLots.gd_LotStep);
   while (SLots.gd_LotStep < 1)
   {
      Print ("LotPrecision(): SLots.gd_LotStep < 1");
      SLots.gd_LotStep *= 10;
      Print ("SLots.gd_LotStep *= 10");
      Print ("LotPrecision(): SLots.gd_LotStep = ", SLots.gd_LotStep);
      li_LotPrecision++;
      Print ("LotPrecision(): li_LotPrecision = ", li_LotPrecision);
   }
   Print ("LotPrecision(): LOTPRES = ", li_LotPrecision);
   return (li_LotPrecision);
}

La variabileli_LotPrecision erasenza modificatore statico, poi ho visto che non dovrebbe perdere valore e l'ho cambiato. Si ènotato che anche se ho aggiunto il modificatore, la variabileli_LotPrecision non mantiene il suo valore.

Lo stampo in OnInite():

void OnTick()
{
   int Lot = CBase.LotPrecision();
   Print ("Lot = ", Lot);
}

Nel registro:

17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep = MarketInfo (_Symbol, MODE_LOTSTEP); = 0.01
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 0.01
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep *= 10
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 0.1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep *= 10
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 2
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 2
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: Lot = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: Lot = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0

Questo mostra chiaramente che dopo l'uscita dalla funzione LotPrecision() , il valore della variabileli_LotPrecision è perso. Come farlo rimanere costante?

Ho provato ad aggiungere questa variabileli_LotPrecision alla sezione privata della classe, per assegnarla al modificatore statico in seguito, ma il compilatore insiste che è impossibile.

unresolved static variable 'BaseInfo::li_LotPrecision'  BaseInfo.mqh    60      10

Gettare la variabile fuori dalla classe non ha senso, perché non è necessaria altrove.

Cosa fare?