Questions sur la POO dans MQL5 - page 38

 
Nikolai Semko:

Oui, je suis aussi dans une situation similaire. Il n'est pas difficile d'apprendre, il est plus difficile de se recycler, de briser les vieilles habitudes. Je n'arrive toujours pas à me débarrasser de nombreuses mauvaises habitudes de la programmation procédurale.

réapprendre le style procédural ? hmm, un code de style procédural bien écrit est généralement facile à intégrer dans une classe, si vous avez besoin de faire évoluer le projet.

Dmitry Fedoseev:

Les constantes et les statiques peuvent être abandonnées pour le moment. Et ne pensez même pas aux interfaces.

Et quand tout est prêt, regardez et marquez quelque chose comme statique et quelque chose comme constante. Et vous pouvez oublier complètement les interfaces.

Je sais comment en faire beaucoup et rapidement,

J'ai décidé de consacrer mon temps à l'étude de la théorie, ou plutôt d'amener MQL au niveau de ce qui existe depuis quelques années, même si beaucoup de gens ici ne connaissent pas les capacités des terminaux

Si je dois étudier la matière, je dois l'étudier correctement, je pense, et comprendre si MQL est plus proche de C++ ou de C# - pour l'instant, il semble que ce soit C++. En C#, les gens ne s'embarrassent même pas de modificateurs, ou plutôt ils se contentent de corriger ce qui est marqué comme douteux par le studio )))).

 
Dmitry Fedoseev:

Les constantes et la statique peuvent simplement être ignorées pour l'instant. Les interfaces, aussi.

Et quand tout est prêt, regardez et marquez quelque chose comme statique et quelque chose comme constant. Et vous pouvez oublier complètement les interfaces.

L'essentiel est de conserver les constantes et les statiques. Je suis d'accord sur les interfaces.

 
Igor Makanu:

se reconvertir à partir du style procédural ? hmm, un code bien écrit de style procédural enveloppé dans une classe, si vous avez besoin de faire évoluer le projet, généralement pas de problème.

Je sais faire beaucoup de choses et rapidement,

J'ai décidé de consacrer mon temps à l'étude de la théorie, ou plutôt à amener MQL au niveau de ce qui a été développé ces dernières années, même si beaucoup de gens ici ne sont pas au courant des capacités des terminaux

Et si vous étudiez le matériel, vous devez l'étudier correctement, imho, et comprendre ce qui est plus proche de MQL à C++ ou à C# tout de même - pour l'instant il semble que ce soit C++.

const - s'il est nécessaire d'interdire l'affectation d'une variable (sauf pour une initialisation unique). Si une variable est déclarée comme const, alors lorsque vous la passez dans une fonction par référence, l'argument de la fonction doit également être const, mais le compilateur s'en chargera, vous n'avez pas à y penser. Si une variable n'est pas assignée, elle peut également être marquée comme const - cela fonctionnera plus rapidement, ceci s'applique aux arguments de fonction. Cependant, à tout moment, vous pouvez avoir besoin de le modifier...

static - si c'est une variable dans une classe, c'est un cas rare, même le plus rare. S'il s'agit d'une méthode de classe, alors si la méthode ne manipule que les arguments de cette méthode et lesvariables statiques de la classe, c'est également un cas rare (cependant, pas si rare, si vous rassemblez simplement les fonctions dans une classe par commodité).

 
Endormi ?
 
Igor Makanu:

Je voudrais un exemple, je vous le dis, je ne suis pas du tout bon avec les modificateurs.


SZS : en attendant ce qui se passe dans l'horreur générale dans la discussion de programmation dans Inet - il y avait un article sur const sur hubra le mois dernier, la signification - oui, ce const n'est pas nécessaire, regardez code assembleur ne diffère pas que sans const - le compilateur va supprimer tout ((

Voici un exemple :

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];
   }
}

La raison pour laquelle une interface est nécessaire n'est pas claire dans votre code, alors je l'ai supprimée.

Bien sûr, je ne connais pas complètement votre tâche, mais il y a une probabilité de 99,99% que ce ne soit pas nécessaire.

 
Igor Makanu:

se reconvertir à partir du style procédural ? hmm, un code bien écrit de style procédural enveloppé dans une classe, si vous avez besoin de faire évoluer le projet, généralement pas de problème.

Je sais en faire beaucoup et rapidement,

J'ai décidé de consacrer mon temps à l'étude de la théorie, ou plutôt à amener MQL au niveau de ce qui a été développé ces dernières années, même si beaucoup de gens ici ne sont pas au courant des capacités des terminaux

Si je dois étudier le matériel, j'ai besoin de l'étudier correctement, imho, et de comprendre ce qui est plus proche de MQL à C++ ou à C# tout de même - pour l'instant il semble que ce soit C++.

mql lui-même est basé sur c++, mais grâce aux efforts de ses créateurs, ils ont implémenté beaucoup de mauvaises choses de Sharp, sans rien y ajouter de bon. La bibliothèque standard de type Sharpe est révélatrice. Il serait plus logique qu'il soit similaire à std. IMHO.
 
Koldun Zloy:

Voici un exemple :

D'après votre code, l'utilité de l'interface n'est pas claire, c'est pourquoi je l'ai supprimée.

Je ne connais pas complètement votre tâche, mais je suis sûr à 99,99 % que vous n'en avez pas besoin.

c'est la 5e fois que j'entends dire qu'il faut jeter les interfaces et ne pas s'en soucier))))

J'ai pris comme base le modèle de conception OOP "Strategy".

appliqué, comme spécifié, les interfaces comme une abstraction à partir de laquelle j'hérite de la classe de base CStrategy - il s'est avéré que je CStrategy sera absent méthodes publiques, tous les publics sont décrits par des interfaces (3 pièces = stratégie elle-même, l'achèvement de la stratégie et maintenant ajouté un enregistrement de l'état de la stratégie ) Le rôle des interfaces est... Eh bien, c'est à peu près la même chose qu'avec les modificateurs const - vous recevez des avertissements au début si vous ne décrivez pas une méthode ou si vous essayez de les fermer avec l'héritage - jusqu'à présent, j'ai plus de commodité que de problèmes.

En général, je confirme qu'avec une probabilité de 100%, c'est inutile... mais c'est juste pratique que la classe CStrategy n'ait pas de section publique

Votre code semble bon, je le reproduirai chez moi après le déjeuner, pour essayer de le comparer avec le mien.

Merci !

 
Vladimir Simakov:
Le mql lui-même est basé sur c++, mais grâce aux efforts de ses créateurs, ils y ont mis beaucoup du mauvais de sharp, sans rien y ajouter de bon. La bibliothèque standard de type Sharpe est révélatrice. Il serait plus logique qu'il soit similaire à std. IMHO.

c'est peut-être moi qui ai lancé la phrase sur le forum MQL "ce n'est pas C++, c'est MQL..." maintenant beaucoup de réponses à des questions comme la vôtre dans ce contexte ))))

en général, le langage est assez démocratique, pas pratique pour écrire en MQL - "en 2 clics" vous pouvez aller à .dll C++ et ici depuis le début de l'année en .dll C#, si ma mémoire est bonne, l'un des premiers articles sur le dll du développeur Renat - c'est-à-dire cette possibilité initialement, comme un concept de produit est offert, imho

SZS : pour écrire ci-dessus, pour une raison quelconque est venu à l'esprit la phrase - Je suis un artiste - Je vois ainsi !))))

 
Igor Makanu:


ZS : à ce qui précède, pour une raison quelconque, il m'est venu à l'esprit la phrase - Je suis un artiste - je le vois ! ))))

cela revient très souvent dans les réponses des développeurs, bonnes ou mauvaises, je ne sais pas

Si les développeurs donnaient des informations et fermaient les questions une fois pour toutes - pourquoi on ne peut pas ajouter ou modifier une fonction

 
Fast235:

cela revient très souvent dans les réponses des développeurs, bon ou mauvais, je ne sais pas.

si les développeurs donnaient des informations et fermaient les questions une fois pour toutes - pourquoi il est impossible d'ajouter ou de modifier une fonction

Eh bien, c'est le style actuel de communication entre les utilisateurs et le soutien des monopoles informatiques, l'Internet est plein de cas où les utilisateurs trouvent les bugs évidents de Microsoft et après avoir fait appel à Microsoft obtenir en réponse ... habituellement le silence ))))

ZS : d'après une lecture récente, Hubr " Pourquoi Windows lit-il un fichier cent mille fois pour ouvrir un menu ? "

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