MQL5中的OOP问题 - 页 9

 
Igor Makanu:

我们说的是什么吨位?所有被忽略的东西都会被终端报告,删除它的地方也知道 - OnDeint() ....。这场讨论是否变成了真空中的球形马的讨论?)))

不,让马骑在它应该骑的地方。

但我们讨论的是以前未知物体的创造。而且我们不仅不知道它们的属性,也不知道创建的对象本身的数量。

当然,对于一个对象,我们可以创建一个指针,并通过这个指针对该对象进行操作。但是,如果我们事先不知道我们将需要多少个指针,这算什么真空?这只是其中一个最简单且立即可用的方法--将指针存储在列表中。它们可以从列表中取出。那么,每个对象都可以有自己的标识符(Type()方法),通过它你可以识别指针对象。有可能精确地识别一个对象(除了它的类型之外,对象还可以被赋予其他属性,以区别于同类型的对象)。

总的来说--感觉我说的是更复杂的结构,这需要对对象进行分类,用列表来存储,以及与对象一起工作的方法,这些对象不仅可以存储和应要求提供信息,还可以 "活着并成长 "与程序互动,不时地自己改变并报告其行动。

也许我走得太远了,只是讨论了一个对象,在初始化过程中必须改变两个字段,而且在对象的生命周期中它们不能以任何方式改变。如果有输入变量,那么拥有一个对象的意义何在?

 
除了创造物品的人,没有人有义务移除物品。即使在某些情况下确实发生了这种情况,也不值得信任。如果你创造了它,你就删除它。
 
Dmitry Fedoseev:
没有人有义务删除一个对象,除了创造它的人。即使在某些情况下发生了这种情况,也是不值得信任的。如果你创造了它,你就删除它。

这倒是真的。但这不是我们要讨论的问题。不是吗?

我们谈论的是一些方法,通过这些方法,对象肯定不会丢失,而且你肯定能找到它们。

当你创建一个对象时,要注意它,不要把它弄丢了,这样以后就可以适当地删除它,而且不会因为对象指针的丢失而出现内存泄漏(我们从例子中的内存泄漏开始,传入函数的对象指针被重新赋值给函数主体中新创建的对象)。

而且每个人都有自己的偏好--有些人喜欢一种东西,有些人喜欢另一种。但我们必须了解我们的每个对象--即使有两个或两千零两个--以便我们以后可以删除它们。无论我们是自己删除它们,还是让列表通过Clear()删除它们,还是在循环中通过列表和删除或其他方式删除它们--这与此无关。

 
Artyom Trishkin:

总的来说,我觉得我说的是更复杂的结构,它需要对对象进行分类,用列表来存储它们,以及与对象一起工作的方法,这些对象不仅可以存储和按要求提供信息,还可以 "活生生地进化 "与程序互动,不时地改变自己并报告自己的行动。

也许我走得太远了,我们只需要讨论一个对象,其中两个字段必须在初始化时改变,并且它们在生命周期内不得以任何方式改变?如果有输入变量,那么拥有一个对象的意义何在?

这是一个奇怪的OOP概念。 首先,OOP是方便的--你写一次,然后创建新的对象的实例。

回到讨论的开始,这是我的例子,我经常用它https://www.mql5.com/ru/forum/160683/page861#comment_11840254

我需要将我的交易限制在现在的一个时间间隔内,下一次是两个时间间隔...4...

我的2次点击的例子是为这项任务修改的。

int OnInit()
{
   Work1=new CWorkTime(StartHour1,StartMinute1,StopHour1,StopMinute1);
   Work2=new CWorkTime(StartHour2,StartMinute2,StopHour2,StopMinute2);
   Work3=new CWorkTime(StartHour3,StartMinute3,StopHour3,StopMinute3);
   Work4=new CWorkTime(StartHour4,StartMinute4,StopHour4,StopMinute4);
}


我不知道,但从类别上想,OOP只是为了把所有东西都包裹在一个类中,而那里是一个奇迹--我的超类,它可以做这两件事......而且,如果这个类是10个字符串,你就不需要OOP--为什么要限制自己,误导大家呢?

我在对我方便的地方使用OOP,讨论显然已经到了宗教的程度--禁止或使用OOP))))。

 
Igor Makanu:

这是一个奇怪的OOP想法,OOP首先是方便的--写一次,然后创建新的对象实例。

回到讨论的开始,这是我的例子,我经常用它https://www.mql5.com/ru/forum/160683/page861#comment_11840254

我需要将我的交易限制在现在的一个时间间隔内,下一次是两个时间间隔...4...

我的2次点击的例子是为这项任务修改的。


我不知道,但从类别上想,OOP只是为了把所有东西都包裹在一个类中,而那里是一个奇迹--我的超类,它可以做这两件事......而且,如果该类是10个字符串,你就不需要OOP--为什么要限制自己并误导大家?

在对我来说方便的地方,那就是我使用OOP的地方,显然讨论已经到了宗教的地步--禁止或使用OOP))))。

绝对的--我不是那个要进入这个宗教的人,因为我自己也积极使用OOP。

例如:如果我们需要更多的时间间隔怎么办?我们应该创造新的吗?为了什么?如果你能在不干扰程序代码的情况下用一个列表做。

我们似乎在谈论不同的事情。我在谈论可用性,而你...我也在谈论可用性,但你展示的是无法使用的代码。当然,也许只是夸大其词,我并不了解......

 
Artyom Trishkin:

例如:如果需要更多的间隔时间怎么办?是否应该创建新的工作网?这有什么意义?如果你能在不干扰程序代码的情况下用一个列表进行管理...

如果我们需要使用类实例的列表或数组,这不是什么大问题,但在这个例子中,使用数组更容易,我们只做一个循环。

bool DisableTrade=false;
   for(int i=0;i<ArraySize(Work);i++)
     {
      if(Work[i].Disable()) {DisableTrade=true; break}
     }
   if(DisableTrade)
     {
      Comment("Не торговое время!!! Сопровождение открытых ордеров");
     }
   else...

阿尔乔姆-特里什金

我们似乎在谈论不同的事情。我在谈论可用性,而你 ...我也在谈论可用性,但你所展示的代码并不方便。当然,也许这只是夸大其词,而我没有理解......

不幸的是,不可能写出万能的代码,即使你写出了万能的代码,它的进一步修改将是一个繁琐的过程,结果是万能的代码将更加耗费资源--一般来说,你可以永远谈论这个问题,曾经我写过,正如一个著名的程序员所说--"代码必须执行它的任务!"。- 这就够了"。其 他的都是...好吧,这是一个欲望的混乱或... 让我们说说创造!)))

 
Artyom Trishkin:

///

例如:如果需要更多的间隔时间怎么办?是否应该创建新的工作网?这有什么意义?如果你能在不干扰程序代码的情况下用一个列表来管理。

///

那么在属性窗口中就不会有数字区间参数。你将无法对它们进行优化。不是一个选项。

为每个区间创建一个新对象也不是最好的选择。但它仍然会导致性能变慢。如果我们要创建一个类,我们应该创建一个将间隔的参数添加到一个数组中。它将会更快。

 
Dmitry Fedoseev: rmosa。如果你必须制作一个类,它应该是这样的,它将把间隔的参数添加到一个数组中。它将会更快。

如果你做一个类或一个函数,并在其中添加()几个参数,如果你创建几个具有单独参数的类,这绝对没有区别。

SZZ:不要忘记,如果你把一个大函数写成长长的 "马带 "形式--CPU缓存并不总是被有效利用,尽管在预测转场时这样的 "马带 "可能会有收获....。只有测试才能表明这一点,但在特定的PC和特定的编译器上...

 
Dmitry Fedoseev:

那么在属性窗口中就不会有数字区间参数。你将无法优化出它。不是一个选项。

为每个区间创建一个新对象也不是最好的选择。毕竟,这将导致更慢的性能。如果我们要创建一个类,我们应该创建一个将间隔的参数添加到一个数组中。这将是更快的。

同意。同样,这一切都归结为设置结账字段的方法。而如何将它们从输入参数转移到存储所有区间的对象,则是一个技术问题。尽管有可能重新创建间隔列表中的所有对象,而当你只改变其中一个对象时--这是一个实用性问题,以及在编写代码时 "麻烦/不麻烦 "地改变数据。

 
Roman:

你能解释一下使用new操作符创建一个动态对象的意义吗?

当一个对象被自动创建时,类对象被创建在堆栈中,在执行时间 上比动态对象更快。
当动态创建一个对象时,一个类对象是在内存中(在堆中)创建的,涉及到操作系统内存管理器,这个过程比较慢。

以下是问题。
如果自动创建更快,那么为什么使用动态对象更好呢?
明确控制内存分配?
消除了可能出现的堆栈溢出?
而不是意外地失去一个物体?
因为如果堆栈溢出,该对象将被自动删除?

下午好。不管是在堆栈还是堆的背景下使用,计算机内存都具有相同的性能。动态内存管理本身取决于垃圾收集器的实现:例如,它可以是Python中的引用计数(较慢的版本),或者在后台进程中通过执行图的遍历来分析对象的生成周期(Net CLR)。在MQL中使用的是哪种变体,我们不得而知,但我们可以假设它是非常有效的,因为MQL5的用户可以直接使用删除操作符,这大大简化了GC本身的工作。因此,你对使用new时的开销的担心是毫无根据的--请随意使用动态内存。

至于 "堆栈溢出",在现代系统中,你可能遇到这种情况的唯一途径是在使用复杂的递归或在递归算法中犯错。现代程序总是在虚拟地址空间的OC保护模式下工作,动态加载内存页,所以不用担心:堆栈不会溢出:)