MQL5中的OOP问题 - 页 21 1...141516171819202122232425262728...96 新评论 Igor Makanu 2019.08.29 21:41 #201 Alexey Navoykov: 这是一个纯粹的测试类,还是你真的要使用它? 如果是后者,你就不应该这么做。 据我所知,当一个角色发生变化时,静态变量 不会被重新初始化。 而且,一般来说,用外部值来初始化常量静力学并不是一个好主意,因为在初始化的时候不一定有这些值。 第二,无论如何我都是在MT4下写的,甚至是为自己写的--它在测试器中对一些符号不起作用,如果我在MT4中看到有用的东西,我将使用MT4Orders切换到MT5--我检查了我的 "创造性工作",这个库没有问题。 首先,我想看到一个适当的OOP的想法--这就是为什么我在测试它,看看会有什么结果,到目前为止,它的进展相当混乱....。我们将看到,我有时间,这是我决定自己做的充电器 )))) 我知道在主代码开始前初始化不是最好的方法,或者说我曾经这样认为,但我从来没有检查过,无论我有多少个新的构建--在MQL中,所有的东西都是可用的,甚至在全局可见性层面,我看到来源的人直接到顶部并这样写。 #property strict int dig = _Digits; double point = _Point; double startbalance = AccountBalance(); 而这些无效的初始化在多年来的构建中一直在起作用。 所以,开发者把人们宠坏了)))) SZZY:在这里,一般来说,在使用OOP时,主要是正确地将问题划分为复杂的元素,而不是继承手头的一切。 我不知道将错误的文本输出 "放在 "哪里--它需要在任何地方,在任何类和程序的任何地方,很可能你将不得不创建一个基类,就像@Vladimir Simakov 在上面展示的代码那样 Alexey Navoykov 2019.08.29 22:39 #202 Igor Makanu: pp1-3都是可以解决的,但是......好吧,这里有静力学的帮助,就让它这样吧,因为有了帮助,至少可以证明他的决定是正确的,现在的代码如下。 创建了3个Cdeal的实例,在日志中得到。 ... 到目前为止,一切都在按计划进行! 即使成功了,也不可靠。 因为这个函数是在类之外实现的,所以很难控制类本身的字段顺序。 你至少应该在类中写一个大胆的注释,说这样那样的字段不能被重新排列)。但无论如何,你最初的变体是更好的。你不应该为了节省一行代码而牺牲安全 ) Igor Makanu 2019.08.29 22:55 #203 Alexey Navoykov: 但同样,你的原始版本更好。不要为了节省一行代码而牺牲了可靠性 ) 哪一个?- 我已经在我的变化中得到了一半的主题)))) 但是,是的,你是百分之百的正确的! SZY: 最简单和最可靠的方法--通过OnInit()中的new创建一个类的实例--并立即复制所有的终端环境变量,但这不是最好的方法--如果我打算在这个例子中的构造函数启动时立即开单,那么这个类的实例可能会被删除,然后可能重新创建--这已经带来一些问题,因为重复调用--我再次开始加载终端,再次浪费内存....。一般来说,这样是无法解决的 ZZZY:也许再做一天的实验,最终以@Vladimir Simakov 为例--那里的一切都很清楚。 [删除] 2019.08.30 06:27 #204 Igor Makanu: 我画出了我的类,它应该用常量值初始化一次字段,而且它似乎能按预期工作。 我不喜欢2件事。 1.我重复调用 SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - 因为没有定义初始化的顺序,即不确定VolumeSTEP会先被初始化,然后才会调用GetDigitsInVolumeStep()。 2.我想摆脱 静态方法static int GetDigitsInVolumeStep() - 我在youtube上看到一个视频,说在纯OOP中不应该使用静态方法,现在我正在和风车斗争 视频的链接,它基本上是相同的https://youtu.be/lfdAwl3-X_c 和https://youtu.be/zME4SOCHT0I 我怎样才能改写这两点,我不喜欢? 1.调用这个函数两次并没有什么问题。 2.那些反对使用静态函数的人没有给出丝毫的论据,这难道不令你困惑吗? 你最好不要随便看别人的视频,要看书。 Igor Makanu 2019.08.30 07:28 #205 Koldun Zloy: 2.那些反对使用静态函数的人没有给出丝毫的论据,你不感到困惑吗? 你是第一个支持我的人,我在另一个主题中写了我对该视频的看法--演讲者甚至不能回答学生的问题。 Artyom Trishkin 2019.08.30 07:34 #206 Igor Makanu: 你是第一个支持我的人,视频与实践中的任何东西都不一致,我在另一个主题中写了我对视频的看法--记者甚至不能回答学生的问题。 我不认为OOP是为了盲目追随某些互联网喉舌毫无根据的假设而削减自己的能力,每个人都以自己的方式扫荡。 Igor Makanu 2019.08.30 08:15 #207 Artyom Trishkin: 我不认为OOP是为了盲目追随某些互联网喉舌毫无根据的假设而降低自己的能力,每个人都在用自己的方式扫荡。 如果你看过视频,你应该明白,目标是....。好吧,总的来说,你也不明白什么,还不够成熟--至少A100是这样向我解释的。 SZZ:我以后会在界面上做一些实验,也许会出现一些 "实体的美"))))。 [删除] 2019.08.30 08:46 #208 我看了他的静力学视频,都是为了这样写的。 new Type0(new Type1(new Type2(...))); 好吧,在静力学上写一个包装器是个问题,不是吗? class Stateless_with_state { Stateless q; Data d; call() {q::call(d);} }; 而通过模板显然更有效率。我喜欢观众的问题,https://www.youtube.com/watch?v=75U9eefFYoU#t=33m25s Igor Makanu 2019.08.31 19:08 #209 Igor Makanu: ZS:我稍后会试验一下接口,也许会出现一些 "实体美"))))。 检查了 "OOP模式-行为模式-策略 "是否有效 interface IStrategy { void Algorithm(); }; //+------------------------------------------------------------------+ class Strategy_1 : public IStrategy { public: Strategy_1() {Print(__FUNCTION__);} void Algorithm() {Print(__FUNCTION__);} }; //+------------------------------------------------------------------+ class Strategy_2 : public IStrategy { public: Strategy_2() {Print(__FUNCTION__);} void Algorithm() {Print(__FUNCTION__);} }; //+------------------------------------------------------------------+ class Context { private: IStrategy *s; public: Context(IStrategy &_strategy) {Print(__FUNCTION__); s = GetPointer(_strategy); s.Algorithm();} ~Context() {delete s;} }; //+------------------------------------------------------------------+ void OnStart() { Context c1(new Strategy_1); Context c2(new Strategy_2); } //+------------------------------------------------------------------+ 2019.08.31 21:04:40.441 tst (EURUSD,H1) Strategy_1::Strategy_1 2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context 2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm 2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Strategy_2 2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context 2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Algorithm 在我看来,工作起来没有任何问题 Vladimir Simakov 2019.08.31 19:41 #210 Igor Makanu: 检查了 "OOP模式-行为模式-策略(Strategy)"是否能发挥作用 2019.08.31 21:04:40.441 tst (EURUSD,H1) Strategy_1::Strategy_1 2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context 2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm 2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Strategy_2 2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context 2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Algorithm 对我来说没有任何问题 Context(IStrategy* _strategy):s(_strategy){Print(__FUNCTION__); s.Algorithm();} 新操作符 返回一个指针。 当然,开发人员在隐式解除引用方面搞砸了,这就是为什么你的版本可以工作,但我宁愿不纠结于无文档的东西。 2.它当然不是C++,但它非常相似,所以初始化列表(我不知道效率如何)是合适的。 1...141516171819202122232425262728...96 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这是一个纯粹的测试类,还是你真的要使用它?
第二,无论如何我都是在MT4下写的,甚至是为自己写的--它在测试器中对一些符号不起作用,如果我在MT4中看到有用的东西,我将使用MT4Orders切换到MT5--我检查了我的 "创造性工作",这个库没有问题。
首先,我想看到一个适当的OOP的想法--这就是为什么我在测试它,看看会有什么结果,到目前为止,它的进展相当混乱....。我们将看到,我有时间,这是我决定自己做的充电器 ))))
我知道在主代码开始前初始化不是最好的方法,或者说我曾经这样认为,但我从来没有检查过,无论我有多少个新的构建--在MQL中,所有的东西都是可用的,甚至在全局可见性层面,我看到来源的人直接到顶部并这样写。
而这些无效的初始化在多年来的构建中一直在起作用。 所以,开发者把人们宠坏了))))
SZZY:在这里,一般来说,在使用OOP时,主要是正确地将问题划分为复杂的元素,而不是继承手头的一切。 我不知道将错误的文本输出 "放在 "哪里--它需要在任何地方,在任何类和程序的任何地方,很可能你将不得不创建一个基类,就像@Vladimir Simakov 在上面展示的代码那样
pp1-3都是可以解决的,但是......好吧,这里有静力学的帮助,就让它这样吧,因为有了帮助,至少可以证明他的决定是正确的,现在的代码如下。
创建了3个Cdeal的实例,在日志中得到。
...
到目前为止,一切都在按计划进行!
但同样,你的原始版本更好。不要为了节省一行代码而牺牲了可靠性 )
哪一个?- 我已经在我的变化中得到了一半的主题))))
但是,是的,你是百分之百的正确的!
SZY:
最简单和最可靠的方法--通过OnInit()中的new创建一个类的实例--并立即复制所有的终端环境变量,但这不是最好的方法--如果我打算在这个例子中的构造函数启动时立即开单,那么这个类的实例可能会被删除,然后可能重新创建--这已经带来一些问题,因为重复调用--我再次开始加载终端,再次浪费内存....。一般来说,这样是无法解决的
ZZZY:也许再做一天的实验,最终以@Vladimir Simakov 为例--那里的一切都很清楚。
我画出了我的类,它应该用常量值初始化一次字段,而且它似乎能按预期工作。
我不喜欢2件事。
1.我重复调用 SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - 因为没有定义初始化的顺序,即不确定VolumeSTEP会先被初始化,然后才会调用GetDigitsInVolumeStep()。
2.我想摆脱 静态方法static int GetDigitsInVolumeStep() - 我在youtube上看到一个视频,说在纯OOP中不应该使用静态方法,现在我正在和风车斗争
视频的链接,它基本上是相同的https://youtu.be/lfdAwl3-X_c 和https://youtu.be/zME4SOCHT0I
我怎样才能改写这两点,我不喜欢?
1.调用这个函数两次并没有什么问题。
2.那些反对使用静态函数的人没有给出丝毫的论据,这难道不令你困惑吗?
你最好不要随便看别人的视频,要看书。
2.那些反对使用静态函数的人没有给出丝毫的论据,你不感到困惑吗?
你是第一个支持我的人,我在另一个主题中写了我对该视频的看法--演讲者甚至不能回答学生的问题。
你是第一个支持我的人,视频与实践中的任何东西都不一致,我在另一个主题中写了我对视频的看法--记者甚至不能回答学生的问题。
我不认为OOP是为了盲目追随某些互联网喉舌毫无根据的假设而削减自己的能力,每个人都以自己的方式扫荡。
我不认为OOP是为了盲目追随某些互联网喉舌毫无根据的假设而降低自己的能力,每个人都在用自己的方式扫荡。
如果你看过视频,你应该明白,目标是....。好吧,总的来说,你也不明白什么,还不够成熟--至少A100是这样向我解释的。
SZZ:我以后会在界面上做一些实验,也许会出现一些 "实体的美"))))。
我看了他的静力学视频,都是为了这样写的。
好吧,在静力学上写一个包装器是个问题,不是吗?
class Stateless_with_state { Stateless q; Data d; call() {q::call(d);} };而通过模板显然更有效率。我喜欢观众的问题,https://www.youtube.com/watch?v=75U9eefFYoU#t=33m25s
ZS:我稍后会试验一下接口,也许会出现一些 "实体美"))))。
检查了 "OOP模式-行为模式-策略 "是否有效
2019.08.31 21:04:40.441 tst (EURUSD,H1) Strategy_1::Strategy_1
2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context
2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm
2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Strategy_2
2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context
2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Algorithm
在我看来,工作起来没有任何问题
检查了 "OOP模式-行为模式-策略(Strategy)"是否能发挥作用
2019.08.31 21:04:40.441 tst (EURUSD,H1) Strategy_1::Strategy_1
2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context
2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm
2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Strategy_2
2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context
2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Algorithm
对我来说没有任何问题
Context(IStrategy* _strategy):s(_strategy){Print(__FUNCTION__); s.Algorithm();}新操作符 返回一个指针。 当然,开发人员在隐式解除引用方面搞砸了,这就是为什么你的版本可以工作,但我宁愿不纠结于无文档的东西。
2.它当然不是C++,但它非常相似,所以初始化列表(我不知道效率如何)是合适的。