Uma pergunta para os especialistas do OOP. - página 6

 
Реter Konow:

O código não é portátil - essa é sua peculiaridade. Não se destina a ser portátil. Tem outro propósito. Bem, o escopo global das variáveis é uma ferramenta poderosa para a implementação de mecanismos complexos. Você só precisa saber como utilizá-lo. Quando as pessoas me falam de erros e bugs ocultos, fico confuso. Eu nunca tive nenhum bug relacionado à visibilidade variável global. Em uma palavra, de modo algum.

O problema com variáveis globais é que se o projeto é suficientemente grande e as mudanças no estado dessas variáveis vêm de muitas seções de código, é bastante demorado procurar por bugs.

Exemplo. Um erro é encontrado porque o valor de uma variável global não é claramente o que deveria ser. Há uma dúzia de arquivos e 100500 linhas de código no projeto. Ninguém se lembra de quantos fragmentos de código esta variável muda. O resultado é um frasco de café e um sono sonoro com sua cabeça presa no teclado.

E agora a mesma coisa, mas OOP. Escrevemos o código corretamente e todos os campos são privados. Assim, diretamente é alterado somente nos métodos de classe, e de fora somente pelo método Set. Assim, colocamos pontos de parada no método Set e quantos métodos existem na classe, onde o campo é mudado, e podemos facilmente rastrear onde as mudanças são feitas e onde elas foram mudadas incorretamente.

 
Реter Konow:

Eu nunca tive nenhum bug relacionado à visibilidade variável global. De forma alguma.

Eu nem sei como convencê-lo do óbvio, mas provavelmente não deveria, não sou pago por isso, não é mesmo?

O que você está tentando fazer? Bem, se você quer elogios, lá está você:

Peter! Muito bem!

))))

 
Vladimir Simakov:

O problema com variáveis globais é que se o projeto é suficientemente grande e as mudanças no estado dessas variáveis vêm de muitas seções de código, é bastante demorado procurar por bugs.

Exemplo. Um bug é encontrado porque o valor de uma variável global não é claramente o que deveria ser. Há uma dúzia de arquivos e 100500 linhas de código no projeto. Ninguém se lembra de quantos fragmentos de código esta variável muda. O resultado é um frasco de café e um sono sonoro com sua cabeça presa no teclado.

E agora temos a mesma coisa, mas é o OOP. Escrevemos o código corretamente e todos os campos são privados. Assim, será alterado diretamente apenas nos métodos de classe, mas de fora apenas pelo método Set. Assim, colocamos pontos de parada no método Set e quantos métodos temos na classe, onde o campo é mudado, e facilmente rastreamos onde as mudanças são feitas e onde elas foram mudadas incorretamente.

Da prática. Eu tenho mais de 100 arquivos conectados em meu projeto. Algumas delas têm mais de 2000 linhas de código. As variáveis globais são utilizadas em todos os lugares. Eu nunca tive nenhum bug relacionado à sua globalidade. Talvez eu tenha acabado de me adaptar?)) Talvez não haja bugs porque todas as variáveis estão em russo e todos os nomes são significativos. Sem sdf ou iukj. Portanto, não tenho erros associados a eles. Em geral, variáveis globais são usadas para bandeiras de eventos globais, por exemplo, abrir uma janela, clicar em botões do mouse, expandir uma lista antiga, etc... Também, para foco. Em outras palavras, o mouse atravessa a GUI, e os números de todos os objetos e elementos e suas propriedades são escritos em variáveis globais, e os blocos necessários são chamados da OnChartEvent, que trabalha imediatamente com os objetos e elementos em foco. Isto é muito conveniente.
 
Igor Makanu:

Eu nem sei como convencê-lo do óbvio, mas provavelmente não deveria, não sou pago por isso, não é mesmo?

O que você está tentando fazer? Bem, se você quer elogios, lá está você:

Peter! Muito bem!

))))

Eu não estou conseguindo nada. Bem, talvez entendendo que não é só com o OOP que você pode escrever projetos legais. E não é apenas o domínio do OOP que é sinal de um desenvolvedor. Eu não discuto que você pode resolver muitas tarefas com o OOP. Mas existem outras abordagens.
 
Obrigado a todos vocês por participarem da discussão. Vou tentar entrar no OOP para realmente comparar as capacidades das duas abordagens. Estou interessado na hierarquia que o OOP pode proporcionar, e se a utilidade dela não for enterrada sob sua sintaxe, eu definitivamente a adotarei.
 
Реter Konow:
Bem, talvez compreendendo o fato, que não apenas com o OOP você pode escrever projetos legais. E não apenas ser proficiente em OOP é sinal de um desenvolvedor. Eu não discuto que você pode resolver muitas tarefas com o OOP. Mas existem outras abordagens.

não se trata de OOP, trata-se dos princípios da própria escrita de código, esta é a segunda vez que falo sobre isso e@Vladimir Simakov escreveu um exemplo acima

Se você quiser usar visibilidade variável global - sem problemas, ninguém proíbe, você pode fazê-lo - mas silenciosamente, enquanto ninguém está observando! )))

mas como um estilo de escrita de programas permanentemente usado é maligno, e quanto mais código, mais maligno é! - assim você explicou? )))

SZY: mais uma tentativa de teste - veja a ajuda da MQL, você vê que todas as funções são feitas como unidades separadas e completamente independentes? - passou os parâmetros = obteve o resultado! Você acha que os programadores Metakvot estão fazendo tudo errado novamente? Deveríamos usar alguns estilos livres de funções de escrita - aqui no escopo global, e aqui o usuário chamará a função e obterá o resultado! )))) - o estilo de procedimento (onde cada sub-rotina é um bloco lógico completo) é o código certo, escreva os códigos corretamente! não o código certo ... bem, ele virá por conta própria "quando você precisar dele rapidamente" ;)

 
Реter Konow:
Da prática. Eu tenho mais de 100 arquivos conectados em meu projeto. Algumas delas têm mais de 2000 linhas de código. As variáveis globais são utilizadas em todos os lugares. Eu nunca tive nenhum bug relacionado à sua globalidade. Talvez eu tenha me adaptado a isso?))

Nem todos têm essa sorte. Já me lembro vagamente de quais variáveis eu entrei hoje. Não me lembro de quais, de uma semana atrás. Mas isso não é um problema, todos eles são locais e o acesso aos campos de qualquer objeto é feito apenas através de funções apropriadas. O OOP me permite não me lembrar de muitas coisas, eu já disse mais de uma vez - idealmente, em qualquer lugar de código você deve ter acesso apenas ao que você precisa e não mais variáveis - então, mesmo que você queira, não pode mudar o que não deve. E quando você realmente precisar, você terá que descobrir porque não pode acessar uma variável- é apenas uma supervisão, ou mais freqüentemente é uma variável que precisa de trabalho adicional para ser modificada. Se ele estivesse imediatamente disponível para você, você os esqueceria, e então levaria muito tempo para descobrir porque o programa não funciona ou não funciona como você quer.

 
Реter Konow:
Eu não estou tentando conseguir nada. Bem, talvez entendendo que não é só com o OOP que você pode escrever projetos legais. E não é apenas o domínio do OOP que é sinal de um desenvolvedor. Eu não discuto que você pode resolver muitas tarefas com o OOP. Mas existem outras abordagens.

Outra coisa boa do OOP é que você gradualmente adquire bibliotecas de classe, especialmente as realmente universais, que permanecem com você durante toda sua vida e facilitam esta vida.

A partir de um projeto real, ele realmente funciona. Aqui não há inconvenientes, você só precisa monitorar o número e o status dos pedidos/posições disponíveis. Esta função somente controla que a posição/ordem não seja fechada/cancelada e a retira da lista após o fechamento.

void OrdersControl(){
   for (CTrade* it=gPos.Begine();
        it!=NULL;
        it=it.Control()?gPos.Next():gPos.Delete());}

Onde gPos é CList<CTrade> gPos

CList e CTrade não são da biblioteca padrão.

CTrade é herdada de minha própria biblioteca CPosition.

Na verdade, abaixo está todo o CTrade que você precisa apenas para tornar seu código de projeto legível:

#include "..\Header.mqh"

#ifndef _C_TRADE_
#define _C_TRADE_

#include "..\..\..\Shared Projects\mqlLib\Objects\Trade\CPosition.mqh"

class CTrade:public CPosition
  {
public:
                     CTrade(double mVolume,int mDirect,double mSL,double mTP);
   bool              Control() {return !( CPosition::Control()&TRADE_FINISH);}
  };
//-------------------------------------------------------------------------------------
void CTrade::CTrade(double mVolume,int mDirect,double mSL,double mTP):
   CPosition(NULL,
             mDirect>0?OP_BUY:OP_SELL,
             mVolume,
             0.0,
             mSL,
             mTP)
{}

#endif
Toda a implementação do tratamento da ordem/posição está oculta no arquivo da biblioteca de CPposições da plataforma cruzada.
 
Реter Konow:
Obrigado a todos vocês por participarem da discussão. Vou tentar mergulhar no OOP a fim de realmente comparar as capacidades das duas abordagens. Estou interessado na hierarquia que o OOP pode proporcionar, e se a utilidade dela não estiver enterrada sob sua sintaxe, certamente vou adotá-la.

Sirva-se no YouTube. Há muita coisa aí. Especialmente em inglês, com o qual você é bom.


Não poupe 45 minutos, Peter. No início, é muito importante entender do que este indivíduo está falando. Muitas pessoas provavelmente discutirão com ele, mas em geral ele está certo:


 
Nikolai Semko:

Sirva-se no YouTube. Há muita coisa aí. Especialmente em inglês, com o qual você é bom.


Não poupe 45 minutos, Peter. No início, é muito importante entender do que este indivíduo está falando. Muitas pessoas provavelmente irão discutir com ele, mas em geral ele tem razão:


Obrigado, Nikolai. Vou ficar de olho.