mql5中的OOP、模板和宏,细微之处和用途 - 页 5

 
pavlick_:

关于多次传球--仓促之间,天真地以为MCL会允许这样做

因此,这里存在着变数。而对于函数--是的,它是可多次传递的,所以一切都很正确。 问题的出现正是因为函数初始化的顺序。 简而言之,在C++中,有一个与变量、函数和类型有关的严格顺序。 而在MQL中,这一切都不同。
 
Alexey Navoykov:
Ну вот я с этого и начинал разговор тут. Планировал тоже заменять все статики на глобалы (хоть это и жесть конечно).  Но как показано выше, с шаблонами такое не прокатит.  С макросами тоже.  А я всё это широко применяю.  Поэтому и сделал свою реализацию.  Хотя она конечно не решает всех проблем.  Динамические массивы по-прежнему нельзя инициализировать, константные типы тоже.  Поэтому их однозначно придётся выносить на глобальный уровень

我也广泛使用模板和宏,但认为自由函数只是辅助性的(通常是不受欢迎的)架构元素。当所有的实现都被打包在对象里面,而静态只在类的层面上声明,恼人的bug就会出现,除了有时很难理解他们正确的声明顺序的逻辑,所以编译器不会发誓...

 
Alexey Navoykov:
因此,这里存在着变数。而对于函数,是的,它是可多次传递的,所以一切都很正确。 问题的出现正是因为函数初始化的顺序。 简而言之,在C++中,有一个严格的顺序,适用于变量、函数和类型。 而在MQL中,一切都不同。

多次传递在任何情况下都是不好的 - 你可能会遇到递归、死锁等问题。但从好的方面看,这是可以做到的。因此,只有明智地、谨慎地(即正向声明),而不是像现在的多通道编译器那样--如果对任何函数进行正向声明,这个耙子迟早会打到你的额头。

 
pavlick_:

多次传递在任何情况下都是不好的--你会遇到递归、死锁等问题。但是,在pluses中,有可能做正向声明。因此,只有明智地、小心地,而不是像现在这样用multipass编译器--因为如果对任何函数进行正向声明,这个耙子迟早会打到你的额头。

我同意。这个话题之前已经讨论过了。这也是这里很多人喜欢这门语言的原因--你不需要理会函数声明的顺序。 不用说,前段时间我自己也很高兴)。 但它的繁琐性从正面刺激了我。 但随着经验的积累,理解力也在增强。

 
Ilya Malev:

我也广泛使用模板和宏,但认为自由函数只是辅助性的(通常是不受欢迎的)架构元素。当所有的实现都被打包在对象里面,而静态只在类的层面上声明,恼人的bug就会出现,除了有时很难理解它们正确的顺序逻辑,所以编译器不会发誓...

我同意,如果一切都在OOP中清楚地排好队,那么不仅不需要自由函数,也不需要通用方法,但在这里,我们面对的是C++和C#之间发展不足的混合体,这就是为什么我们不得不用拐杖实现很多东西 )
 
Alexey Navoykov:
我同意,如果在OOP中一切都排得很清楚,那么不仅自由函数是不需要的,模板方法也是。

只要你不想写一堆重复的代码,无论是OOP还是非OOP,都需要模板方法。自由函数是另一回事--这些是不同的编程风格。

 
Ilya Malev:

只要你不想写一堆重复的代码,就需要模板方法,不管是OOP还是非OOP的。

在OOP中,接口的设计就是为了做到这一点。
 
Alexey Navoykov:
在OOP中,接口就是为此目的而发明的。

接口有点不同。如果我想让同样的代码根据参数类的不同类型来完成同样的工作(不需要声明额外的类),那么接口是没有用的。

 
Ilya Malev:

接口有点不同。如果我想让同样的代码根据参数类的不同类型做同样的工作(不需要声明额外的类),那么接口就没有帮助。

如果参数是不同的类型,那么做几个具有相应类型的重载方法 是有意义的。 你仍然要在函数中以某种方式将它们分开。 因此,最好将它们分成独立的函数,而不是创建一个混乱的、同样采取非个人类型的函数,即错误地将任何东西传入其中,在库内得到一个编译错误,这是不可取的。 甚至可能没有,这是加倍的糟糕)。

简而言之,在成熟的OOP中,模板函数是一个拐杖(除了少数例外)。

 
Alexey Navoykov:


简而言之,模板函数是 成熟的OOP中的一个拐杖

所以我们在这里。

关于交易、自动交易系统和交易策略测试的论坛

mql5语言的特点、技巧和窍门

Alexey Navoykov, 2019.01.25 10:11

嗯,这就是我在这里 开始谈话的原因。我本来也打算用globals来代替所有的static(当然,这是件很残酷的事情)。 但如上所示,模板 和宏也不起作用。 而我对它们的使用都很广泛。这就是为什么我做了自己的实现。 虽然它没有解决所有的问题。 动态数组仍然不能被初始化,常量类型也不能。 这就是为什么它们肯定要被全局化。
所以,事实证明,你所有的代码都是用拐杖做的?这不是针对个人的。