Perguntas sobre OOP em MQL5 - página 40

 
Dmitry Fedoseev:

const - se for necessário proibir a atribuição de variáveis (exceto uma vez durante a inicialização). Se uma variável é declarada como conts, então ao passá-la para uma função por referência, o argumento da função também deve ser constante, mas o compilador forçará isso, não é preciso 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 e variá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).

Ainda não cheguei a tentar a DLL C# para MQL5. Eu costumava usar invólucros C++ e criei uma instância de classe em C#. Tenho uma suspeita de que esta DLL utilizará agora uma classe estática, o que limita severamente as opções. Alguém sabe se uma classe estática ou dinâmica está sendo criada agora?

 
Alexey Volchanskiy:

Ainda não experimentei a DLL C# para MQL5. Eu costumava fazer isso com invólucros C++, no lado positivo foi criada uma instância da classe em C#. Tenho uma suspeita de que agora a DLL utilizará uma classe estática, o que limita severamente suas possibilidades. Alguém sabe se agora está criando uma classe estática ou uma classe dinâmica?

Eu só usei estáticos para MQL5 - se for usado modificador estático, a assinatura será visível diretamente da MU, muito útil

sobre a restrição, você poderia jogar a tarefa em um fio separado e depois matá-la.

ou escreva chamadas dentro da dll

não é um problema


UPD:

Não tenho certeza se posso explicar minha recente pesquisa sobre a lógica do uso do OOP em tarefas de MQL, mas vou lhe dizer o que vejo

Em geral, se usarmos o estilo OOP, respeitando totalmente o controle de acesso e assegurando a definição de todos os modificadores privados/protegidos/públicos e uso obrigatório constante para cada definição e assinatura de método (pode ser removido mais tarde se usado para modificar dados) e escrevendo todo o acesso aos dados protegidos com get / set, o resultado de usar o OOP corretamente, é a detecção de grandes bugs namodificação não intencionalde dados durante o desenvolvimento.

Eu reescrevi uma classe desse jeito do zero - imediatamente o compilador encontrou incompatibilidade com meu problema, entrou na classe base de descendente ao verificar (testar) a idéia, e como sempre me distraí e esqueci de remover - não o fato de que eu teria encontrado esse bug no teste, eu poderia ter pensado que era a intenção))) .

Outra vantagem notável para mim é a ausência de todas as variáveis descritas globalmente - tento não usá-las, elas não são usadas aqui (bem, exceto pela bandeira de otimização global - para atender minhas necessidades e a bandeira de erro crítico ao negociar)

Uma observação interessante é que ao reescrever todas as chamadas via get / set, a classe da fonte primeiro aumentou em tamanho e depois começou a diminuir significativamente, quando comecei a substituir nas chamadas de get / set - não digo que isso inflaciona muito o código em tamanho, mas novamente - isso proporcionará controle sobre a integridade dos dados!


SZY: bem, se você é um perfeccionista de coração e acredita que uma chamada extra via get / set é um relógio extra na CPU, então quando a tarefa está 100% concluída, não é difícil contar as chamadas para cada get / set via busca no código fonte e aplicar uma regra antiga - se você chamar uma seção de código mais de uma vez, então você deve fazer esta seção de código como uma sub-rotina.... ninguém proíbe fazer o contrário ---> apenas uma chamada para receber / definir para atribuir / ler campo.... mas isto é para dizer "truques sujos" com benefícios questionáveis

 
Igor Makanu:

Eu só usei estáticos para MQL5 - se você tiver modificador estático, a assinatura será visível diretamente da MU, muito útil

sobre a restrição, você poderia jogar a tarefa em um fio separado e depois matá-la.

ou escreva chamadas dentro da dll

Eu não acho que isso seja um problema.

Não me refiro a membros estáticos para a Sharp, mas sim a isto

public static class ClassName {}

Não se pode criar uma instância de classe estática via nova e destruí-la via exclusão, não tem construtores e destruidores, todos os membros e métodos são estáticos. De qualquer forma, já faz muito tempo que eu não trabalho lá, mas lembro como era desconfortável, como uma cama procrusteana.

São normalmente usados como um recipiente para funções de biblioteca, como funções matemáticas.

 
Alexey Volchanskiy:

Eu não quis dizer membros estáticos para a Sharp, mas isto

Acho que é uma classe que não verá MQL sem o modificador estático, mas verá se os métodos dentro da classe tiverem um modificador estático.

você pode usar qualquer classe dentro da dll localmente, eu tenho o WinForm em uma classe dll sem estática. tudo funciona bem, mas eu chamo funções declaradas com estática, e onde estas funções são declaradas dentro da classe - não importa a chamada dll da MQL, mesmo que a classe inteira seja estática ou não.

ainda não poderei verificá-lo, não instalei o estúdio em meu laptop depois de tê-lo substituído por SSD, ainda não preciso dele

 
Alexey Volchanskiy:

Ainda não experimentei a DLL C# para MQL5. Eu costumava fazer isso com invólucros C++, no lado positivo foi criada uma instância da classe em C#. Tenho uma suspeita de que agora a DLL utilizará uma classe estática, o que limita severamente suas possibilidades. Alguém sabe se uma classe estática ou dinâmica está sendo criada agora?

A classe é regular, os métodos são estáticos. Eu não tentei nenhuma outra opção.

 
Igor, Dmitry, em resumo, você mesmo tem que tentar. Pelo que entendi, em qualquer caso, é necessário referir-se ao nome da classe, não ao nome do objeto de classe. Vou tentar, obrigado.
 
Olá, se eu tenho uma pergunta sobre sinais, onde devo escrever? Gostaria de saber se é razoável subscrever sinais, se o depósito = $312 ? E como evitar a dependência do corretor e trabalhar efetivamente, se eu comecei a negociar há um mês e meio atrás? Comecei a negociar há um mês e meio. Obrigado.
 
Alexey Volchanskiy:
Igor, Dmitry, em resumo, você mesmo tem que tentar. Pelo que entendi, em qualquer caso, é necessário fazer referência pelo nome da classe, e não pelo nome do objeto de classe. Vou tentar, obrigado.

Endereço com o nome da classe.

 
Alexey Volchanskiy: Igor, Dmitry, em resumo, você mesmo tem que tentar. Entendo que, em qualquer caso, o nome da classe deve ser referido, e não o nome do objeto de classe. Vou tentar, obrigado.

Não posso afirmar que esta é a única maneira de chamar C# da MQL5, usei um exemplo de desenvolvedores dohttps://www.mql5.com/ru/forum/285631

#import "TestLib.dll"

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int x=41;
   TestClass::Inc(x);
   Print(x);
  }

public class TestClass
{
   public static void Inc(ref int x)
   {
    x++;
   }
}

Eu usei o exemplo dos desenvolvedores para obter o ponto de entrada em C#, não usei outras formas, com alguns ajustes no mesmo código .dll pode ser compilado para MT4

artigo e minha pesquisa sobre por que o código do artigo não funciona como pretendido https://www.mql5.com/ru/forum/3153/page4#comment_10366498 - tudo funciona até agora

 

olhou os resultados da minha batalha com o código estilo OOP - hmmm... excelente! ))))


Eu tenho uma pergunta, mas em meu código, bem, três vezes exatamente, eu uso uma construção como:

private:
   COrder            *m_order;
.......

// использую так
return(CheckPointer(m_order)==POINTER_INVALID ? true : m_order.Orderclose());

//или так

if(CheckPointer(m_order)==POINTER_INVALID)

chama tudo em métodos privados, mas existe um "método Jedi ?" para escapar no código fonte doCheckPointer(m_order)==POINTER_INVALID

Estou perguntando sobre alguns get / set

nenhum problema especial, mas por assim dizer um capricho, ou enquanto a sede de conhecimento dos métodos OOP em C++ ainda não diminuiu