Perguntas sobre OOP em MQL5 - página 38

 
Nikolai Semko:

Sim, eu também tenho uma situação semelhante. Não é difícil de aprender, é mais difícil de se reciclar, de quebrar velhos hábitos. Eu ainda não consigo dar pontapés em muitos maus hábitos de programação de procedimentos.

reaprender do estilo de procedimento? hmm, código de estilo de procedimento bem escrito é geralmente fácil de envolver em uma classe, se você precisar escalar o projeto

Dmitry Fedoseev:

Constantes e estáticas podem ser simplesmente abandonadas por enquanto. E não pense sequer em interfaces.

E quando tudo estiver pronto, então olhe e marque algo como uma estática e algo como uma constante. E você pode esquecer completamente as interfaces.

Eu sei como fazer muitas coisas rapidamente,

Decidi dedicar meu tempo ao estudo da teoria, ou melhor, elevar o MQL ao nível do que tem estado lá fora nos últimos anos, mesmo muitas pessoas aqui não sabem sobre as possibilidades dos terminais

Se vou estudar o material, preciso estudá-lo corretamente, imho, e entender se o MQL está mais próximo de C++ ou C# - por enquanto parece ser C+++. Em C# as pessoas nem se preocupam com modificadores, ou melhor, apenas consertam o que está marcado como duvidoso pelo estúdio ))))

 
Dmitry Fedoseev:

Constantes e estáticas podem simplesmente ser ignoradas por enquanto. Interfaces, também.

E quando tudo estiver pronto, então olhe e marque algo como uma estática e algo como uma constante. E você pode esquecer completamente as interfaces.

O principal é manter constantes e estáticas. Eu concordo com as interfaces.

 
Igor Makanu:

reeducar-se do estilo processual? hmm, código de estilo processual bem escrito embrulhado em uma classe, se você precisar escalar o projeto, geralmente não há problema

Eu sei fazer muito e rápido,

Decidi dedicar meu tempo ao estudo da teoria, ou melhor, elevar o MQL ao nível do que tem sido desenvolvido nos últimos anos, mesmo muitas pessoas aqui não estão atualizadas sobre as capacidades dos terminais

E se você estudar o material, você tem que estudá-lo corretamente, imho, e entender o que está mais próximo do MQL para C++ ou C# - por enquanto parece ser C+++.

const - se for necessário proibir a atribuição de uma variável (exceto para inicializações únicas). Se uma variável é declarada como conts, então quando você a passa para uma função por referência, os argumentos da função também devem ser constantes, mas o compilador fará isso acontecer, você não tem que pensar sobre isso. Se uma variável não estiver sendo atribuída, ela também pode ser marcada como const - ela funcionará mais rapidamente, isto se aplica a argumentos de função. No entanto, a qualquer momento, pode ser necessário modificá-lo...

estática - se é uma variável em uma classe, é um caso raro, mesmo o mais raro. Se é um método de classe, então se o método trata apenas de argumentos deste método evariáveis estáticas da classe, também é um caso raro (entretanto, não tão raro, se você apenas coletar funções em uma classe por conveniência).

 
Adormecido?
 
Igor Makanu:

Eu gostaria de um exemplo, estou lhe dizendo, não sou nada bom com modificadores.


SZS: enquanto isso o que se passa em geral horror na discussão de programação em Inet - aqui estava um artigo sobre const on hubra no mês passado, o significado - esta const não é necessária, olhar assembler code não difere que sem const - compilador vai tirar tudo ((

Aqui está um exemplo:

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

Não está claro em seu código porque uma interface é necessária, então eu a joguei fora.

É claro que não conheço completamente sua tarefa, mas há uma probabilidade de 99,99% de que não seja necessária.

 
Igor Makanu:

estilo de procedimento de reaprendizagem? hmm, código de estilo de procedimento bem escrito embrulhado em uma classe, se você precisar escalar o projeto, geralmente não é um problema

Eu sei fazer muito e rápido,

Decidi dedicar meu tempo ao estudo da teoria, ou melhor, elevar o MQL ao nível do que foi desenvolvido nos últimos anos, mesmo muitas pessoas aqui não estão em dia com as possibilidades do terminal

Se vou estudar o material, preciso estudá-lo corretamente, imho, e entender o que está mais próximo do MQL ao C++ ou ao C# - por enquanto parece ser C+++.

O próprio mql é baseado no c++, mas através dos esforços de seus criadores implementaram muitas coisas ruins da Sharp, sem acrescentar nada de bom a partir dele. A biblioteca padrão Sharpe é reveladora. Pareceria mais lógico se fosse semelhante à std. IMHO.
 
Koldun Zloy:

Aqui está um exemplo:

De seu código, não está claro para que serve a interface, então eu a joguei fora.

Não conheço completamente sua tarefa, mas é 99,99% de certeza que você não precisa dela.

esta é a quinta vez que ouço dizer que você deve jogar fora as interfaces e não se preocupe))))

Tomei como base o modelo de design "Estratégia" do OOP.

aplicadas, como especificado, interfaces como uma abstração da qual herdei a classe base CStrategy - descobri que I CStrategy será métodos públicos ausentes, todos os públicos são descritos por interfaces (3 peças = estratégia em si, conclusão da estratégia e agora adicionado um registro de estado da estratégia ) O papel das interfaces é... bem, mais ou menos o mesmo que com os modificadores constantes - você recebe avisos no início se não descrever um método ou tentar fechá-los com herança - até agora tenho mais conveniência do que problemas.

Em geral, confirmo que com 100% de probabilidade é desnecessário. mas é apenas conveniente que a classe CStrategy não tenha uma seção pública

Seu código parece bom, vou reproduzi-lo em meu lugar depois do almoço, tente compará-lo com o meu

Obrigado!

 
Vladimir Simakov:
O próprio mql é baseado no c++, mas através dos esforços de seus criadores, eles colocaram muito do mal do afiado nele, sem acrescentar nada de bom. A biblioteca padrão Sharpe é reveladora. Pareceria mais lógico se fosse semelhante à std. IMHO.

talvez tenha sido eu quem iniciou a frase no fórum MQL "não é C++, é MQL..." agora muitas respostas a perguntas como a sua neste contexto ))))

em geral a linguagem é bastante democrática, não conveniente para escrever em MQL - "em 2 cliques" você pode ir para .dll C++ e aqui desde o início do ano em .dll C#, se a memória servir, um dos primeiros artigos em dll da Developer Renat - ou seja, esta possibilidade inicialmente, como um conceito de produto é oferecido, imho

SZS: para escrever acima, por alguma razão veio à mente a frase - Eu sou um artista - eu vejo isso!))))

 
Igor Makanu:


ZS: ao acima mencionado, por alguma razão veio à mente a frase - Eu sou um artista - eu vejo isso! )))

isto me vem à mente com muita freqüência em respostas de desenvolvedores, boas ou ruins, não sei

Se os desenvolvedores pudessem dar informações e fechar perguntas de uma vez por todas - por que você não pode adicionar ou alterar uma função

 
Fast235:

isto aparece com muita freqüência nas respostas dos desenvolvedores, boas ou ruins, não sei

se os desenvolvedores pudessem dar informações e fechar as questões de uma vez por todas - por que é impossível adicionar ou alterar uma função

Bem, este é o estilo corporativo existente de comunicação entre usuários e suporte de monopolistas de TI, a Internet está cheia de casos em que os usuários encontram os bugs óbvios da Microsoft e depois de apelar para a Microsoft obter em resposta ... geralmente silêncio ))))

ZS: de uma leitura recente, Hubr " Por que o Windows lê um arquivo cem mil vezes para abrir um menu? "

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