关于OOP(面向对象的编程)的问题 - 页 11

 

我想听听更多有经验的程序员对其中一些细微差别的看法。以类中变量的声明 为例。例如,我在类中有一些变量,这些变量被声明在某个类的不同方法中。它们在每个方法中最常被声明。值得这样做吗?还是在私人 部分声明一次后再使用更好?

我想,如果在循环中使用计数器变量,会更符合逻辑,对吗?毕竟,在计算的时候,计数器被明确地设置为一个值,例如,如果我们使用一个循环。

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

}

在每个方法中,声明一个变量i 是不合理的,因为这可能是对内存单元的不必要的浪费。一般来说,我对这种事情感兴趣。

这不仅涉及循环,还涉及其他选择。有足够多的不同的变量必须被多次声明,但它们发挥着同样的作用......我唯一能看到的是,其中一些将不得不在价值上归零,以便它们不包含以前操作的 "垃圾"。这样做是否合理,还是重新声明这样的变量更容易...一般来说,我希望听到专业人士的介绍。

[删除]  
hoz:

我想听听更多有经验的程序员对其中一些细微差别的看法。以类中变量的声明为例。例如,我在类中有一些变量,这些变量被声明在某个类的不同方法中。它们在每个方法中最常被声明。值得这样做吗?还是在私人 部分声明一次后再使用更好?

我想,如果在循环中使用计数器变量,会更符合逻辑,对吗?毕竟,在计算的时候,计数器被明确地设置为一个值,例如,如果我们使用一个循环。

在每个方法中,声明一个变量i 是不合理的,因为这可能是对内存单元的不必要的浪费。一般来说,我对这种事情感兴趣。

这不仅涉及循环,还涉及其他选择。有足够多的不同的变量必须被多次声明,但它们发挥着同样的作用......我唯一能看到的是,其中一些将不得不在价值上归零,以便它们不包含以前操作的 "垃圾"。这样做是否合理,还是重新声明这样的变量更容易...一般来说,我希望听到专业人士的介绍。

你是否应该这样做,取决于创建变量的目的。如果一个实体被一个类所封装,例如一个订单,那么我们将需要在类中定义变量来表达其属性,例如订单的票据。这些变量将被该类的所有方法共享,用于该类中的同一个对象。

如果创建一个变量是为了在方法中提供一个循环,它应该在方法中被定义为自动的(即不使用静态关键字)。在这种情况下,即使一个方法在自己的循环中调用另一个方法,而这个方法也有一个循环,并且使用了同名的变量,你也不会有任何问题。当使用一个在类中声明的变量时,该变量将在第二个方法的循环中被改写。

对于自动变量,在进入函数时自动分配内存,退出时自动删除,开销最小。此外,如果函数很简单,编译器可以生成完全不分配和释放自动内存的代码。

保存这种存储单元在一段时间前曾经是一件明智的事情,但大约在20年前,它终于失去了意义......

 

有一个班级。它有这样一个简单的方法,都是没有品牌的地狱,因为我在寻找错误所在。

// 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);
}

变量li_LotPrecision 以前是没有静态 修改器的,后来我看到它不应该失去价值,就把它改了。人们注意到,即使我添加了修改器,li_LotPrecision变量没有保留其值

我把它打印到OnInite()

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

在日志中。

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

这清楚地表明,在退出LotPrecision() 函数后,li_LotPrecision 变量的值会丢失如何使其保持恒定?

我试着把这个li_LotPrecision 变量添加到私有 类部分,以便以后把它分配给静态 修改器,但编译器坚持认为这是不可能的。

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

把这个变量扔出类是没有意义的,因为其他地方不需要它

该怎么做?