Preguntas sobre POO en MQL5 - página 38

 
Nikolai Semko:

Sí, yo también tengo una situación similar. No es difícil aprender, es más difícil volver a entrenar, romper los viejos hábitos. Todavía no puedo dejar muchos malos hábitos de la programación procedimental.

¿reaprender del estilo procedimental? hmm, el código de estilo procedimental bien escrito suele ser fácil de envolver en una clase, si necesitas escalar el proyecto

Dmitry Fedoseev:

Las constantes y la estática pueden dejarse de lado por ahora. Y ni siquiera pienses en las interfaces.

Y cuando todo esté listo, entonces mira y marca algo como estática y algo como constante. Y puedes olvidarte de las interfaces por completo.

Sé cómo hacer muchas cosas rápidamente,

Decidí dedicar mi tiempo a estudiar la teoría, o más bien a poner a MQL al nivel de lo que ha salido en los últimos años, incluso mucha gente de aquí no conoce las capacidades de los terminales

Si voy a estudiar el material, necesito estudiarlo bien, imho, y entender si MQL está más cerca de C++ o de C# - por ahora parece ser C++. En C# la gente ni siquiera se molesta con los modificadores, o más bien sólo arreglan lo que el estudio marca como sospechoso )))

 
Dmitry Fedoseev:

Las constantes y la estática pueden ser simplemente ignoradas por el momento. También las interfaces.

Y cuando todo esté listo, entonces mira y marca algo como estático y algo como constante. Y puedes olvidarte por completo de las interfaces.

Lo principal es mantener las constantes y la estática. Estoy de acuerdo con lo de las interfaces.

 
Igor Makanu:

¿reaprender el estilo procedimental? hmm, el código de estilo procedimental bien escrito envuelto en una clase, si necesitas escalar el proyecto, normalmente no es un problema

Sé hacer mucho y rápido,

He decidido dedicar mi tiempo a estudiar la teoría, o más bien a poner MQL al nivel de lo que se ha desarrollado en los últimos años, incluso mucha gente aquí no está al día de las capacidades de los terminales

Y si se estudia el material hay que estudiarlo bien, imho, y para entender lo que está más cerca de MQL a C ++ o a C # todo lo mismo - por ahora parece ser C ++.

const - si es necesario prohibir la asignación de una variable (excepto para la inicialización única). Si una variable se declara como const, entonces cuando la pasas a una función por referencia, el argumento de la función también debería ser const, pero el compilador hará que esto ocurra, no tienes que pensar en ello. Si una variable no está siendo asignada, también puede ser marcada como const - funcionará más rápido, esto se aplica a los argumentos de la función. Sin embargo, en cualquier momento, puede necesitar modificarlo...

static - si es una variable en una clase, es un caso raro, incluso el más raro. Si se trata de un método de clase, entonces si el método maneja sólo argumentos de este método yvariables estáticas de la clase, también es raro (sin embargo, no es tan raro si sólo se juntan funciones en una clase por conveniencia).

 
¿Durmiendo?
 
Igor Makanu:

Me gustaría un ejemplo, ya te digo, no soy nada bueno con los modificadores.


SZS: mientras tanto lo que pasa en el horror general en la discusión de programación en Inet - aquí fue un artículo sobre const en hubra el mes pasado, el significado - sí, este const no es necesario, mira código ensamblador no difiere que sin const - el compilador eliminará todo ((

He aquí un ejemplo:

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

No está claro en tu código por qué se necesita una interfaz, así que la he desechado.

Por supuesto, no conozco completamente su tarea, pero hay un 99,99% de probabilidades de que no sea necesario.

 
Igor Makanu:

¿Realizar una formación de estilo procedimental? hmm, un código de estilo procedimental bien escrito envuelto en una clase, si necesitas escalar el proyecto, normalmente no hay problema

Sé hacer mucho y rápido,

He decidido dedicar mi tiempo a estudiar la teoría, o más bien a poner MQL al nivel de lo que se ha desarrollado en los últimos años, incluso mucha gente aquí no está al día de las capacidades de los terminales

Si voy a estudiar el material, tengo que estudiarlo bien, imho, y para entender lo que está más cerca de MQL a C ++ o a C # todo lo mismo - por ahora parece ser C ++.

El propio mql está basado en c++, pero por el esfuerzo de sus creadores implementaron muchas cosas malas de Sharp, sin añadir nada bueno de él. La biblioteca estándar tipo Sharpe es reveladora. Sería más lógico si fuera similar a la std. EN MI OPINIÓN.
 
Koldun Zloy:

He aquí un ejemplo:

A partir de tu código, no está claro para qué sirve la interfaz, así que la he desechado.

No conozco completamente tu tarea, pero es 99,99% seguro que no lo necesitas.

es la 5ª vez que oigo que hay que tirar las interfaces y no molestar)))

Tomé como base la plantilla de diseño OOP "Estrategia".

aplicado, como se especifica, las interfaces como una abstracción de la que hereda la clase base CStrategy - resultó que me CStrategy estará ausente métodos públicos, todos los públicos son descritos por las interfaces (3 piezas = estrategia en sí, la finalización de la estrategia y ahora añadió un registro de estado de la estrategia ) El papel de las interfaces es... Bueno, más o menos lo mismo que con los modificadores const - se obtienen advertencias al principio si no se describe un método o se intenta cerrarlos con la herencia - hasta ahora tengo más comodidad que problemas.

En general confirmo que con un 100% de probabilidad es innecesario... pero es conveniente que la clase CStrategy no tenga una sección pública

Tu código tiene buena pinta, lo reproduciré en mi casa después de comer, intentaré compararlo con el mío

Gracias.

 
Vladimir Simakov:
El propio mql está basado en c++, pero por el esfuerzo de sus creadores han metido mucho de lo malo de sharp en él, sin añadir nada bueno de él. La biblioteca estándar tipo Sharpe es reveladora. Sería más lógico si fuera similar a la std. EN MI OPINIÓN.

quizás fui yo quien inició la frase en el foro MQL "no es C++, es MQL..." ahora muchas respuestas a preguntas como la tuya en este contexto ))))

en general, el lenguaje es bastante democrático, no es conveniente escribir en MQL - "en 2 clics" se puede ir a .dll C ++ y aquí desde el comienzo del año en .dll C #, si la memoria no me falla, uno de los primeros artículos sobre dll del desarrollador Renat - es decir, esta posibilidad inicialmente, como un concepto de producto se ofrece, imho

SZS: al escribir arriba, por alguna razón me vino a la mente la frase - Soy un artista - Ya lo veo!))

 
Igor Makanu:


ZS: a lo anterior, por alguna razón me vino a la mente la frase - Soy un artista - ¡Ya veo! )))

esto me viene a la mente muy a menudo en las respuestas de los desarrolladores, buenas o malas, no lo sé

Si los desarrolladores dieran información y cerraran las preguntas de una vez por todas - por qué no se puede añadir o cambiar una función

 
Fast235:

esto aparece muy a menudo en las respuestas de los desarrolladores, bueno o malo, no lo sé

si los desarrolladores dieran información y cerraran las preguntas de una vez por todas - por qué es imposible añadir o cambiar una función

Bueno, este es el estilo corporativo existente de la comunicación entre los usuarios y el apoyo de los monopolistas de TI, la Internet está llena de casos en los que los usuarios encuentran los errores obvios Microsoft y después de apelar a Microsoft obtener en respuesta ... normalmente el silencio ))))

ZS: de una lectura reciente, Hubr " ¿Por qué Windows lee un archivo cien mil veces para abrir un menú? "

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