Bibliotecas: Price_Compare - página 4

 
Koldun Zloy:

Digamos assim. Qual é exatamente a função das macros?

void OnTick() // Moldura.
{
  Print("Hello World!");
  
  ::OnTick2();
}

#define OnTick OnTick2

void OnTick() {} // Original.
[Excluído]  

Tudo isso é um pouco evasivo. Não é tão difícil inserir o código necessário em uma função.

Na verdade, você está escondendo do usuário da biblioteca que algum código foi adicionado à função.

Se tiver que lidar com esses truques no programa de outra pessoa, você amaldiçoará o autor.


E aqui está um exemplo de uso incorreto de macros em sua biblioteca:

#define  CHECK_INIT_SYNC if (INIT_SYNC::Check()) return

void OnTimer( void )
{
  CHECK_INIT_SYNC;

  ::OldOnTimer();
}

Essa macro oculta o fato de que pode haver uma saída de função neste local.

Por que você precisa dela? Para economizar alguns centavos de letras? Isso não é sério.


Você pode usar macros para compilação condicional e para declaração de tipos (ainda não existe um typedef normal).

Às vezes, você também precisa declarar constantes usando macros.

Em todos os outros casos, as macros apenas confundem o código.

Aqui está um exemplo claro de confusão: https: //www.mql5.com/ru/forum/170952/page50#comment_5488178.

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2017.07.20
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
Koldun Zloy:

Tudo isso é um pouco evasivo. Não é tão difícil inserir o código necessário em uma função.

Na verdade, você está escondendo do usuário da biblioteca que algum código foi adicionado à função.

Se tiver que lidar com esses truques no programa de outra pessoa, você amaldiçoará o autor.

A questão está na conveniência e na demanda por essa solução. Nesse caso, é possível dar ou remover qualidades síncronas a um indicador por meio de uma linha. Talvez você seja a pessoa que acha isso inconveniente.

E aqui está um exemplo de uso incorreto de macros em sua biblioteca:

Essa macro oculta o fato de que pode haver uma saída da função nesse local.

Por que você precisa dela? Para economizar alguns centavos de letras? Isso não é sério.

Tirá-la do contexto dessa forma não é bom. Uma macro é usada em toda função On.

É permitido usar macros para compilação condicional e para declaração de tipos (ainda não existe um typedef normal).

Às vezes, também é necessário declarar constantes usando macros.

Em todos os outros casos, as macros apenas confundem o código.

Aqui está um exemplo claro de confusão: https: //www.mql5.com/ru/forum/170952/page50#comment_5488178.

O que há de errado com esse exemplo?

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)


E se precisarmos substituir OrdersTotal()?

[Excluído]  

Tirá-la do contexto dessa forma não é bom. A macro é usada em todas as funções do On.

Eu já vi todas elas. Ela não faz nada de útil em todas essas funções.

O que há de errado com essa?

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

Ela também não faz nada além de confundir.

E se precisarmos substituir OrdersTotal()?


Você não precisa substituir OrdersTotal().

 
Koldun Zloy:

Eu já vi todos eles. Em todas essas funções, ele não faz nada de útil.

Também não faz nada além de confundir.

Você não precisa substituir OrdersTotal().

Eu ouvi você. Não sei o quanto é conveniente para outras pessoas usar as bibliotecas publicadas e quantas pessoas são seus usuários.

É por isso que não vou falar pelos outros. Talvez, algum dia, eu tenha uma atitude diferente em relação às macros. No momento, não posso concordar com você.