Perguntas OOP (Object Oriented Programming) - página 11

 

Eu gostaria da opinião de programadores mais experientes sobre algumas das nuances. Tomar declarações de variáveis em classes. Por exemplo, eu tenho variáveis em classes que são declaradas dentro de métodos diferentes de uma determinada classe. Eles são declarados em cada método com mais freqüência. Vale a pena fazer isso, ou é melhor declará-los uma vez na seção privada e depois usá-los?

Acho que seria mais lógico usar variáveis contrárias, se elas forem usadas em loops, certo? Afinal, o contador é explicitamente definido para um valor no momento do cálculo, por exemplo, se utilizarmos um laço:

for (i = OrdersTotal() - 1; i >= 0; i--)
{

}

Em cada método, não seria razoável declarar uma variável i, porque isso provavelmente é um desperdício desnecessário de memória nas células de memória. Em geral, estou interessado em tais coisas.

Isto também diz respeito não apenas aos loops, mas também a outras opções. Há variáveis diferentes suficientes que têm de ser declaradas mais de uma vez, mas desempenham o mesmo papel... A única coisa que posso ver é que alguns deles terão que ser zerados em valor, para que não contenham "lixo" de operações anteriores. É razoável fazê-lo ou é mais fácil redeclarar tal variável... Em geral, eu gostaria que os profissionais me falassem sobre isso.

 
hoz:

Gostaria de obter uma opinião de programadores mais experientes sobre algumas das nuances. Tomar declarações de variáveis em classes. Por exemplo, eu tenho variáveis em classes que são declaradas dentro de métodos diferentes de uma determinada classe. Eles são declarados em cada método com mais freqüência. Vale a pena fazer isso, ou é melhor declará-los uma vez na seção privada e depois usá-los?

Acho que seria mais lógico usar variáveis contrárias, se elas forem usadas em loops, certo? Afinal, o contador é explicitamente definido para um valor no momento do cálculo, por exemplo, se utilizarmos um laço:

Em cada método, não seria razoável declarar uma variável i, porque isso provavelmente é um desperdício desnecessário de memória nas células de memória. Em geral, estou interessado em tais coisas.

Isto também diz respeito não apenas aos loops, mas também a outras opções. Há variáveis diferentes suficientes que têm de ser declaradas mais de uma vez, mas desempenham o mesmo papel... A única coisa que posso ver é que alguns deles terão que ser zerados em valor, para que não contenham "lixo" de operações anteriores. É razoável fazê-lo ou é mais fácil redeclarar tal variável... Em geral, eu gostaria que os profissionais me falassem sobre isso.

Se você deve ou não fazê-lo depende da finalidade da criação da variável. Se uma entidade for encapsulada por uma classe, por exemplo, uma ordem, então precisaremos de variáveis definidas na classe para expressar suas propriedades, por exemplo, um bilhete para a ordem. Estas variáveis serão compartilhadas por todos os métodos daquela classe para o mesmo objeto naquela classe.

Se uma variável é criada para fornecer um loop dentro de um método, ela deve ser definida dentro do método como automática (isto é, sem usar a palavra-chave estática). Neste caso, mesmo que um método chame outro método dentro de seu próprio loop, que também tem um loop, e a variável com o mesmo nome seja usada, você não terá nenhum problema. Ao utilizar uma variável declarada em uma classe, a variável será sobregravada no laço do segundo método.

Para variáveis automáticas, a memória é alocada automaticamente quando a função é inserida e automaticamente apagada quando sai, com o mínimo de despesas gerais. Além disso, se as funções forem simples, o compilador pode gerar códigos que não alocam e liberam memória automática de forma alguma.

Salvar células de memória deste tipo costumava ser uma coisa sensata de se fazer há algum tempo, mas finalmente perdeu seu significado há cerca de 20 anos...

 

Há uma classe. Tem um método tão simples, tudo sem marca para o inferno, porque eu estava procurando onde o bicho está:

// 1.5 Определяем минимальную разрядность лота. ===========================================================================================
int BaseInfo::LotPrecision()
{
   static int li_LotPrecision = 0;     // устанавливаем минимальную разрядность лота в ноль
   Print ("LotPrecision()_Before: li_LotPrecision = ", li_LotPrecision);
   Print ("LotPrecision()_BeforeCircle: SLots.gd_LotStep = ", SLots.gd_LotStep);
   while (SLots.gd_LotStep < 1)
   {
      Print ("LotPrecision(): SLots.gd_LotStep < 1");
      SLots.gd_LotStep *= 10;
      Print ("SLots.gd_LotStep *= 10");
      Print ("LotPrecision(): SLots.gd_LotStep = ", SLots.gd_LotStep);
      li_LotPrecision++;
      Print ("LotPrecision(): li_LotPrecision = ", li_LotPrecision);
   }
   Print ("LotPrecision(): LOTPRES = ", li_LotPrecision);
   return (li_LotPrecision);
}

A variávelli_LotPrecision costumava ser sem modificador estático, então eu vi que não deveria perder valor e a mudei. Foi notado que, mesmo adicionando o modificador, a variávelli_LotPrecision não retém seu valor.

Imprimo-o para OnInite():

void OnTick()
{
   int Lot = CBase.LotPrecision();
   Print ("Lot = ", Lot);
}

No diário de bordo:

17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep = MarketInfo (_Symbol, MODE_LOTSTEP); = 0.01
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 0.01
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep *= 10
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 0.1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: SLots.gd_LotStep *= 10
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 2
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 2
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: Lot = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: Lot = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17:26:03 2014.07.22 14:10  RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0

Isto mostra claramente que, após sair da função LotPrecision() , o valor da variávelli_LotPrecision é perdido. Como fazer para que permaneça constante?

Eu tentei adicionar esta variávelli_LotPrecision à seção de classe privada, a fim de atribuí-la mais tarde ao modificador estático, mas o compilador insiste que isso é impossível.

unresolved static variable 'BaseInfo::li_LotPrecision'  BaseInfo.mqh    60      10

Jogar a variável fora da classe não tem sentido, porque ela não é necessária em nenhum outro lugar.

O que fazer?