Perguntas sobre OOP em MQL5 - página 90

 
Igor Makanu:

se no meu exemplo:

copiar os valores asc e bid no método onTick() e usar _Ask, _Bid (comércio virtual) no resto dos métodos

será como trabalhar com variáveis globais?

ZS: como opção, posso, naturalmente, passar por referência e me ater a todos os métodos, mas novamente questiono o que é mais eficiente

Se este tópico ainda é relevante, eu destacaria que a opção de manter os campos é tanto menos eficiente quanto menos correta conceitualmente. Em princípio, os dois conceitos quase sempre se correlacionam.
O código limpo (sem efeitos colaterais) é sempre melhor otimizado pelo compilador, e mais fácil de entender.
Se seu objeto for destinado a mudar seu estado sob a influência de dados de entrada, ele não deve armazenar esses dados de entrada (exceto para fins de cache).
Você tem que separar as moscas das costeletas.

 

Uma vez feita uma pergunta sobre duas maneiras de rubricar variáveis em uma classe. Este aqui:

class CA{
   protected:
      int val;
   public:
      CA(){
         val=0;
      }      
};

E este aqui:

class CA{
   protected:
      int val;
   public:
      CA():val(0){
      }      
};

Perguntei qual é a vantagem da segunda via e me disseram que com ela é possível inicializar os membros estáticos. Mas os membros estáticos não são inicializados dessa forma.

Então a questão é a mesma - qual é a diferença de princípio e qual é a vantagem da segunda via?

 

Citação

Хочется закончить свою песнь важными словами. Любые описанные механизмы, принципы и паттерны, как и ООП в целом не стоит применять там, где это бессмысленно или может навредить. Это ведет к появлению статей со странными заголовками типа «Наследование — причина преждевременного старения» или «Синглтон может приводить к онкологическим заболеваниям».
 
Dmitry Fedoseev:

Uma vez feita uma pergunta sobre duas maneiras de rubricar variáveis em uma classe. Aqui está um como este:

https://www.mql5.com/ru/forum/85652/page45#comment_15975127

Dmitry Fedoseev:

Perguntei qual é a vantagem da segunda via e me disseram que os membros estáticos podem ser inicializados por ela. Mas os membros estáticos não são inicializados dessa forma.

Eles são campos constantes , não estáticos.

class CA
{
protected:
   const int         val;
   static int        static_val;
public:
                     CA(): val(0) { }
};
static int CA::static_val = 12345;
Dmitry Fedoseev:

Portanto, a questão continua a mesma - qual é a diferença de princípio e qual é a vantagem da segunda via?

Se descartarmos a afirmação "é considerado má forma", então o que for mais conveniente, é o que usaremos, imho.

 
Sim, isso mesmo, constante, confuso)
 

Vou começar o tópico novamente, apaguei o post anterior, pensei ter descoberto por conta própria....


aqui está o código:

class CSetting  
{
public:
   enum T            {T1, T2, T3, T4, T5, T6, T7, T8};
   enum D            {D1, D2, D3, D4, D5, D6, D7, D8};
   enum V            {V1, V2, V3, v4};
private:
   int               param1, param2;
   T                 t;
   D                 d;
   V                 v;
public:
                     CSetting(const int in_param1,const int in_param2,const T in_t,const D in_d,const V in_v);
  };
//+------------------------------------------------------------------+
CSetting::CSetting(const int in_param1,const int in_param2,const T in_t,const D in_d,const V in_v)
   : param1(in_param1),
     param2(in_param2),
     t(in_t),
     d(in_d),
     v(in_v)
  {}

//--- input parameters
input int              Input_p1 = 1;   // p1 = -1000 ... +1000
input int              Input_p2 = 2;   // p2 = -1000 ... +1000
input CSetting::T      Input_T = CSetting::T::T1;
input CSetting::D      Input_D = CSetting::D::D1;
input CSetting::V      Input_V = CSetting::V::V1;

Quero 3 enums e 2 ints da seção privat do CSetting para preencher com um int em que, pouco a pouco, irei armazenar estes dados, esboçando o código:

class CSetting
  {
public:
   enum T            {T1, T2, T3, T4, T5, T6, T7, T8};
   enum D            {D1, D2, D3, D4, D5, D6, D7, D8};
   enum V            {V1, V2, V3, v4};
private:
   int               param1, param2;
   T                 t;
   D                 d;
   V                 v;
public:
                     CSetting(const uint data);
  };
//+------------------------------------------------------------------+
CSetting::CSetting(const uint data)
{
   v = (V)(data & 0x3);
   d = (D)((data >> 2) & 0x7);
   t = (T)((data >> 5) & 0x7);
   uint tmp = ((data >> 8) & 0xFFF);
   param2 = (tmp & 0x800) == 0x800 ? -(int)(tmp & 0x7FF) : (int)(tmp & 0x7FF);
   tmp = data >> 20;
   param1 = (tmp & 0x800) == 0x800 ? -(int)(tmp & 0x7FF) : (int)(tmp & 0x7FF);
}
//+------------------------------------------------------------------+
//--- input parameters
input int DATA         = 0xFFFFFFFF;

em teoria, deve funcionar, retiro os 2 + 3 + 3 bits inferiores dos dados para enumerar, e os 24 bits restantes da int para preencher param1 e param2, mantendo o 12º bit como o caráter do número


como posso verificar se há um erro? )))

ou ficaria grato pelas idéias de outra pessoa de como salvar esses dados para int

 
Alternativamente: t+d*10+v*100
 
Igor Makanu:

como você verifica se há erros? )))

A forma usual - embalar, desembalar, verificar se é idêntico. de preferência, verificar todas as caixas de fronteira.
 
Dmitry Fedoseev:
ou t+d*10+v*100

isto não vai funcionar,

você tem que mudar pouco a pouco ou multiplicar/split por 2, o que equivale a mudar

TheXpert:
bem, como de costume - embalar, desembalar, verificar a identidade. de preferência, verificar todas as caixas de fronteira.

Então, sim... logicamente

mas eu não estava planejando fazer a embalagem - estou diminuindo o número de variáveis de entrada para otimizar e preciso de muitos passes GA em cima deles, para que GA não converge rapidamente


casos-limite já foram verificados, mas pela experiência.... os insetos são tão astuciosos!!! )))

HH: É claro que posso reiniciar o loop de 0...MAX_UINT em um arquivo e vê-lo visualmente, mas não é a melhor opção, imho.

 
Igor Makanu:

não vai funcionar,

...

Por que não funcionaria? Três enumerações, nenhuma delas mais do que 10. Aritmética das escolas primárias do segundo ano.

Razão: