Domande su OOP in MQL5 - pagina 38

 
Nikolai Semko:

Sì, anch'io ho una situazione simile. Non è difficile imparare, è più difficile riqualificarsi, rompere le vecchie abitudini. Non riesco ancora a prendere a calci molte cattive abitudini della programmazione procedurale.

reimparare dallo stile procedurale? hmm, il codice in stile procedurale ben scritto è di solito facile da avvolgere in una classe, se hai bisogno di scalare il progetto

Dmitry Fedoseev:

Le costanti e la statica possono essere abbandonate per ora. E non pensate nemmeno alle interfacce.

E quando tutto è pronto, allora guardate e segnate qualcosa come statica e qualcosa come costante. E potete dimenticare del tutto le interfacce.

So fare molte cose velocemente,

Ho deciso di dedicare il mio tempo allo studio della teoria, o meglio di portare MQL al livello di ciò che è stato fuori negli ultimi anni, anche molte persone qui non conoscono le capacità dei terminali

Se ho intenzione di studiare il materiale, ho bisogno di studiarlo correttamente, imho, e di capire se MQL è più vicino a C++ o C# - per ora sembra essere C++. In C# la gente non si preoccupa nemmeno dei modificatori, o piuttosto si limita a correggere qualsiasi cosa sia segnata come dubbia dallo studio ))))

 
Dmitry Fedoseev:

Le costanti e la statica possono essere semplicemente ignorate per il momento. Anche le interfacce.

E quando tutto è pronto, allora guardate e segnate qualcosa come statico e qualcosa come costante. E potete dimenticare del tutto le interfacce.

La cosa principale è mantenere le costanti e la statica. Sono d'accordo sulle interfacce.

 
Igor Makanu:

reimparare lo stile procedurale? hmm, codice in stile procedurale ben scritto avvolto in una classe, se hai bisogno di scalare il progetto, di solito non è un problema

So fare molto e velocemente,

Ho deciso di dedicare il mio tempo allo studio della teoria, o meglio di portare MQL al livello di ciò che è stato sviluppato negli ultimi anni, anche molte persone qui non sono aggiornate sulle capacità dei terminali

E se si studia il materiale bisogna studiarlo bene, imho, e capire cosa è più vicino a MQL a C++ o a C# lo stesso - per ora sembra essere C++.

const - se è necessario proibire l'assegnazione di una variabile (tranne che per l'inizializzazione una tantum). Se una variabile è dichiarata come conts, allora quando la passate in una funzione per riferimento, anche l'argomento della funzione dovrebbe essere const, ma il compilatore farà in modo che ciò accada, non dovete pensarci. Se una variabile non viene assegnata, può anche essere marcata come const - funzionerà più velocemente, questo vale per gli argomenti delle funzioni. Tuttavia, in qualsiasi momento, potrebbe essere necessario modificarlo...

static - se è una variabile in una classe, è un caso raro, anche il più raro. Se è un metodo di classe, allora se il metodo gestisce solo gli argomenti di questo metodo e levariabili statiche della classe, è anche raro (tuttavia, non così raro se raccogliete solo funzioni in una classe per comodità).

 
Dormire?
 
Igor Makanu:

Vorrei un esempio, ti dico che non sono per niente bravo con i modificatori.


SZS: nel frattempo cosa succede nell'orrore generale nella discussione di programmazione in Inet - qui c'era un articolo su const su hubra il mese scorso, il significato - sì, questo const non è necessario, guarda il codice assembler non differisce che senza const - il compilatore rimuoverà tutto ((

Ecco un esempio:

struct SSettingsForOrder
{
   int mPeriod;
   double mTakeProfit;
   double mStopLoss;
};

class CStrategy
{
   SSettingsForOrder mSettings;
   
   bool mDirty;
   
public:
   CStrategy() : mDirty( true ){}

   CStrategy( SSettingsForOrder& set ) : mSettings( set ), mDirty( true ){}
   
   virtual void NextStepStrategy();
   
   bool IsDirty() const
   {
      return mDirty;
   }
   
   int GetPeriod() const
   {
      return mSettings.mPeriod;
   }
   void SetPeriod( int period )
   {
      if( mSettings.mPeriod != period )
      {
         mSettings.mPeriod = period;
         mDirty = true;
      }
   }
   double GetTakeProfit() const
   {
      return mSettings.mTakeProfit;
   }
   void SetTakeProfit( double takeProfit )
   {
      mSettings.mTakeProfit = takeProfit;
      mDirty = true;
   }
   double GetStopLoss() const
   {
      return mSettings.mStopLoss;
   }
   void SetStopLoss( double stopLoss )
   {
      mSettings.mStopLoss = stopLoss;
      mDirty = true;
   }
   void Load( int fileHandle )
   {
      FileReadStruct( fileHandle, mSettings );
      mDirty = false;
   }
   void Save( int fileHandle )
   {
      FileWriteStruct( fileHandle, mSettings );
      mDirty = false;
   }
};

class CStrategy_XXX : public CStrategy
{
public:
   CStrategy_XXX(){}
   CStrategy_XXX( SSettingsForOrder& set ) : CStrategy( set ){}
   
   virtual void NextStepStrategy();
};

class CStrategy_YYY : public CStrategy
{
public:
   CStrategy_YYY(){}
   CStrategy_YYY( SSettingsForOrder& set ) : CStrategy( set ){}
   
   virtual void NextStepStrategy();
};

class CStrategy_ZZZ : public CStrategy
{
public:
   CStrategy_ZZZ(){}
   CStrategy_ZZZ( SSettingsForOrder& set ) : CStrategy( set ){}
   
   virtual void NextStepStrategy();
};

CStrategy* Strategies[3];

void OnInit()
{
   Strategies[0] = new CStrategy_XXX();
   Strategies[1] = new CStrategy_YYY();
   Strategies[2] = new CStrategy_ZZZ();
   
   int fileHandle = FileOpen( ... );
   for( int i = 0; i < 3; i++ )
   {
      Strategies[i].Load( fileHandle );
   }
   FileClose( fileHandle );
}

void TestAndSave()
{
   bool saveRequired = false;
   for( int i = 0; i < 3; i++ )
   {
      if( Strategies[i].IsDirty() )
      {
         saveRequired = true;
         break;
      }
   }
   if( saveRequired )
   {
      int fileHandle = FileOpen( ... );
      for( int i = 0; i < 3; i++ )
      {
         Strategies[i].Save( fileHandle );
      }
      FileClose( fileHandle );
   }
}

void OnDeinit()
{
   TestAndSave();
   
   for( int i = 0; i < 3; i++ )
   {
      delete Strategies[i];
   }
}

Non è chiaro dal tuo codice perché sia necessaria un'interfaccia, quindi l'ho buttata via.

Naturalmente, non conosco completamente il vostro compito, ma c'è una probabilità del 99,99% che non sia necessario.

 
Igor Makanu:

riqualificare dallo stile procedurale? hmm, codice in stile procedurale ben scritto avvolto in una classe, se hai bisogno di scalare il progetto, di solito non c'è problema

So fare molto e velocemente,

Ho deciso di dedicare il mio tempo allo studio della teoria, o meglio di portare MQL al livello di ciò che è stato sviluppato negli ultimi anni, anche molte persone qui non sono aggiornate sulle capacità dei terminali

Se ho intenzione di studiare il materiale, ho bisogno di studiarlo bene, imho, e di capire cosa è più vicino a MQL a C++ o a C# lo stesso - per ora sembra essere C++.

mql stesso è basato su c++, ma attraverso gli sforzi dei suoi creatori hanno implementato molte cose brutte da Sharp, senza aggiungere nulla di buono da esso. La biblioteca standard simile a quella di Sharpe è eloquente. Sarebbe più logico se fosse simile a std. IMHO.
 
Koldun Zloy:

Ecco un esempio:

Dal tuo codice, non è chiaro a cosa serva l'interfaccia, quindi l'ho buttata via.

Non conosco completamente il vostro compito, ma è sicuro al 99,99% che non ne avete bisogno.

Questa è la 5° volta che sento dire che si dovrebbero buttare le interfacce e non preoccuparsi)))

Ho preso il modello di design OOP "Strategy" come base

applicato, come specificato, interfacce come astrazione da cui eredito la classe base CStrategy - si è scoperto che I CStrategy sarà assente metodi pubblici, tutti i pubblici sono descritti da interfacce (3 pezzi = strategia stessa, completamento strategia e ora aggiunto un record di stato strategia ) Il ruolo delle interfacce è... beh, più o meno come con i modificatori const - si ottengono avvisi all'inizio se non si descrive un metodo o si cerca di chiuderli con l'ereditarietà - finora ho più comodità che problemi.

In generale confermo che con il 100% di probabilità è inutile... ma è solo conveniente che la classe CStrategy non abbia una sezione pubblica

Il tuo codice sembra buono, lo riprodurrò al mio posto dopo pranzo, cercando di confrontarlo con il mio

Grazie!

 
Vladimir Simakov:
Lo stesso mql è basato su c++, ma attraverso gli sforzi dei suoi creatori hanno messo molto del male di sharp in esso, senza aggiungere nulla di buono. La biblioteca standard simile a Sharpe è eloquente. Sarebbe più logico se fosse simile a std. IMHO.

forse sono stato io a iniziare la frase sul forum MQL "non è C++, è MQL..." ora un sacco di risposte a domande come la tua in questo contesto ))))

in generale il linguaggio è abbastanza democratico, non conveniente per scrivere in MQL - "in 2 click" si può andare a .dll C ++ e qui dall'inizio dell'anno in .dll C#, se la memoria serve, uno dei primi articoli su dll da Developer Renat - cioè questa possibilità inizialmente, come un concetto di prodotto è offerto, imho

SZS: per scrivere sopra, per qualche motivo mi è venuta in mente la frase - sono un artista - lo vedo!)))

 
Igor Makanu:


ZS: a quanto sopra, per qualche motivo mi è venuta in mente la frase - sono un artista - lo vedo! )))

questo mi viene in mente molto spesso nelle risposte degli sviluppatori, bene o male, non so

Se gli sviluppatori dessero informazioni e chiudessero le domande una volta per tutte - perché non si può aggiungere o cambiare una funzione

 
Fast235:

questo viene fuori molto spesso nelle risposte degli sviluppatori, bene o male, non so

se gli sviluppatori dessero informazioni e chiudessero le domande una volta per tutte - perché è impossibile aggiungere o cambiare una funzione

Bene questo è lo stile aziendale esistente di comunicazione tra gli utenti e il supporto di monopolisti IT, Internet è pieno di casi in cui gli utenti trovano i bug evidenti Microsoft e dopo aver fatto appello a Microsoft ottenere in risposta ... di solito il silenzio ))))

ZS: da una lettura recente, Hubr " Perché Windows legge un file centomila volte per aprire un menu? "

Почему для открытия меню Windows читает один файл сто тысяч раз?
Почему для открытия меню Windows читает один файл сто тысяч раз?
  • habr.com
«Проводник тратит 700 мс на то, чтобы открыть контекстное меню панели задач. 75% этого времени он выполняет 114 801 операцию считывания из одного файла, средний объём считываемых данных 68 байт. Мне стоит написать пост об этом, или достаточно саркастичного твита?» За компьютером я работаю быстро, и поэтому меня раздражает, когда приходится...
Motivazione: