OOP vs programmazione procedurale - pagina 6

 
Dmitry Fedoseev:

E come farete a far adattare il trailing ai diversi parametri?

Proviamo su un compito specifico. Se ne hai uno, per favore forniscilo.
 
Реter Konow:
Preferibilmente portare a un compito specifico. Tale descrizione non è molto chiara. Nella mia pratica, l'algoritmo non cambia cambiando i parametri esterni. È reso universale in anticipo per qualsiasi valore di questi parametri. Pertanto, non è molto chiaro cosa intendi. Descrivilo su un esempio concreto.
class Ордер
{
  public: int SELL;

  Ордер(void) // Конструктор имеет то же имя, что и класс. Выполняется при инициализации переменной класса
  {
    SELL=0;
    int k=OrdersHistoryTotal()-1;
    for(; k>=0; k--)
    {
      if(!OrderSelect(k, SELECT_BY_POS, MODE_HISTORY)) continue;
      if(OrderType()==OP_SELL)SELL++;
    }
  }
}x;

void OnStart()
{
  Alert(x.SELL);
}

Grazie all'OOP, il programma principale è molto breve e chiaro. Questo è solo il primo esempio che mi viene in mente. Se avete bisogno di calcolare frequentemente il numero di ordini, i vantaggi sono evidenti. È difficile capirlo la prima volta. Ma anche le funzioni, anche con parametri, una volta erano una difficoltà

 
Реter Konow:
Proviamo su qualche compito particolare. Se l'hai fatto, per favore forniscilo.

Compito specifico. Il cliente ha ordinato un Expert Advisor per due MA, che includerebbe tutte le varianti di trailing disponibili nel codice base, ma non rallenterebbe nel tester.

L'EA dovrebbe anche avere la prospettiva di essere aggiornato con nuove varianti di trailing in futuro (a basso costo).

 
STARIJ:

Grazie a OOP, il programma principale è molto breve e chiaro. Questo è solo il primo esempio che mi viene in mente. Se abbiamo bisogno di calcolare frequentemente il numero di ordini, i vantaggi sono evidenti. È difficile capirlo la prima volta. Ma anche le funzioni, anche con parametri, una volta erano una difficoltà

Non capisco, perché non fare una funzione "int Number_orders()" che farà sempre il ciclo di cui sopra e restituirà il valore del contatore "SELL"?

Per esempio:

 int Количество_ордеров()
  {
    SELL=0;
    int k=OrdersHistoryTotal()-1;
    for(; k>=0; k--)
    {
      if(!OrderSelect(k, SELECT_BY_POS, MODE_HISTORY)) continue;
      if(OrderType()==OP_SELL)SELL++;
    }
   return(SELL);
  }


Perché abbiamo bisogno di una classe qui?

 
Dmitry Fedoseev:

Per esempio, 100 varianti di trailing stop devono essere stipate in un solo Expert Advisor. Quando si programma proceduralmente, si ottiene un casino come questo:

100 frammenti di codice identici. Quando il programma è in esecuzione, di solito include solo un trailing stop. I restanti 99 if consumano solo risorse.

Ora per la variante OOP. Durante l'inizializzazione di Expert Advisor, scaliamo l'array con i puntatori in base al numero di piste, creiamo oggetti solo per le piste incluse. Di conseguenza, il seguente codice funzionerà sempre:

Se una barra di trascinamento è abilitata, allora cnt=1, cioè non c'è nulla di inutile.

Fate un array di nomi di funzioni, scegliete il nome dall'indice e accedete.


L'OOP non c'entra niente. Questa è una limitazione del linguaggio che stanno cercando di risolvere con OOP

 

Non l'ho provato, ma per esempio non si può fare un linguaggio non tipico senza un OOP.

 
Реter Konow:

Non capisco perché non fare una funzione "int Number_orders()" che farà sempre il ciclo di cui sopra e restituirà il valore del contatore "SELL"?

Avendo finalizzato la classe, avrò x.SELL x.BUY x.ALL e tutto il resto che mi serve. E sarà molto facile affrontarli. Classi OOP - per semplicità
 
Dmitry Fedoseev:

Compito specifico. Il cliente ha ordinato un Expert Advisor per due MA, che includerebbe tutte le varianti di trailing disponibili nel codice base, ma non rallenterebbe nel tester.

E con la prospettiva di aggiungere nuove varianti di traino in futuro (non costose).

Capisco, questo è un argomento indiscutibile a favore dell'OOP. Stupidità del cliente e mancanza di tempo per combatterlo e mancanza di volontà di migliorare l'algoritmo di qualcun altro). Sì, avete bisogno di OOP in questo caso. Sono d'accordo).
 
STARIJ:
Raffinando la classe, otterrò x.SELL x.BUY x.ALL e qualsiasi altra cosa sia necessaria. E sarà molto facile affrontarli. Classi OOP - per semplicità
Mettendo a punto la funzione, potete ottenere tutte queste stesse variabili in un array, che passerete in questa funzione. Allora usalo come previsto...
 
СанСаныч Фоменко:

Fate un array di nomi di funzioni, scegliete un nome dall'indice e chiamatelo.


Non ha niente a che fare con OOP. Questa è una limitazione del linguaggio che stanno cercando di risolvere con l'aiuto di OOP.

Non c'è nessuna chiamata di funzione dal nome definito come una stringa. E in quelle lingue dove esiste, è fatto attraverso un hash di una tabella, cioè, è un terribile handicap.

Un modo normale per risolvere questo problema sarebbe quello di usare i puntatori alle funzioni (su questo ho scritto qui). Ma perché usare solo i puntatori, c'è un modo più conveniente - OOP, che permette non solo di sfruttare i puntatori di funzione, ma anche di strutturare convenientemente dati e codice.

Motivazione: