MQL5中的OOP问题 - 页 21

 
Alexey Navoykov:
这是一个纯粹的测试类,还是你真的要使用它?
如果是后者,你就不应该这么做。 据我所知,当一个角色发生变化时,静态变量 不会被重新初始化。
而且,一般来说,用外部值来初始化常量静力学并不是一个好主意,因为在初始化的时候不一定有这些值。

第二,无论如何我都是在MT4下写的,甚至是为自己写的--它在测试器中对一些符号不起作用,如果我在MT4中看到有用的东西,我将使用MT4Orders切换到MT5--我检查了我的 "创造性工作",这个库没有问题。

首先,我想看到一个适当的OOP的想法--这就是为什么我在测试它,看看会有什么结果,到目前为止,它的进展相当混乱....。我们将看到,我有时间,这是我决定自己做的充电器 ))))


我知道在主代码开始前初始化不是最好的方法,或者说我曾经这样认为,但我从来没有检查过,无论我有多少个新的构建--在MQL中,所有的东西都是可用的,甚至在全局可见性层面,我看到来源的人直接到顶部并这样写。

#property strict
int    dig = _Digits;
double point = _Point;
double startbalance = AccountBalance();

而这些无效的初始化在多年来的构建中一直在起作用。 所以,开发者把人们宠坏了))))




SZZY:在这里,一般来说,在使用OOP时,主要是正确地将问题划分为复杂的元素,而不是继承手头的一切。 我不知道将错误的文本输出 "放在 "哪里--它需要在任何地方,在任何类和程序的任何地方,很可能你将不得不创建一个基类,就像@Vladimir Simakov 在上面展示的代码那样

 
Igor Makanu:

pp1-3都是可以解决的,但是......好吧,这里有静力学的帮助,就让它这样吧,因为有了帮助,至少可以证明他的决定是正确的,现在的代码如下。

创建了3个Cdeal的实例,在日志中得到。

...

到目前为止,一切都在按计划进行!

即使成功了,也不可靠。 因为这个函数是在类之外实现的,所以很难控制类本身的字段顺序。 你至少应该在类中写一个大胆的注释,说这样那样的字段不能被重新排列)。但无论如何,你最初的变体是更好的。你不应该为了节省一行代码而牺牲安全 )
 
Alexey Navoykov:
但同样,你的原始版本更好。不要为了节省一行代码而牺牲了可靠性 )

哪一个?- 我已经在我的变化中得到了一半的主题))))

但是,是的,你是百分之百的正确的!

SZY:

最简单和最可靠的方法--通过OnInit()中的new创建一个类的实例--并立即复制所有的终端环境变量,但这不是最好的方法--如果我打算在这个例子中的构造函数启动时立即开单,那么这个类的实例可能会被删除,然后可能重新创建--这已经带来一些问题,因为重复调用--我再次开始加载终端,再次浪费内存....。一般来说,这样是无法解决的


ZZZY:也许再做一天的实验,最终以@Vladimir Simakov 为例--那里的一切都很清楚。

[删除]  
Igor Makanu:

我画出了我的类,它应该用常量值初始化一次字段,而且它似乎能按预期工作。

我不喜欢2件事。

1.我重复调用 SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - 因为没有定义初始化的顺序,即不确定VolumeSTEP会先被初始化,然后才会调用GetDigitsInVolumeStep()

2.我想摆脱 静态方法static int GetDigitsInVolumeStep() - 我在youtube上看到一个视频,说在纯OOP中不应该使用静态方法,现在我正在和风车斗争

视频的链接,它基本上是相同的https://youtu.be/lfdAwl3-X_chttps://youtu.be/zME4SOCHT0I


我怎样才能改写这两点,我不喜欢?

1.调用这个函数两次并没有什么问题。

2.那些反对使用静态函数的人没有给出丝毫的论据,这难道不令你困惑吗?

你最好不要随便看别人的视频,要看书。

 
Koldun Zloy:

2.那些反对使用静态函数的人没有给出丝毫的论据,你不感到困惑吗?

你是第一个支持我的人,我在另一个主题中写了我对该视频的看法--演讲者甚至不能回答学生的问题。

 
Igor Makanu:

你是第一个支持我的人,视频与实践中的任何东西都不一致,我在另一个主题中写了我对视频的看法--记者甚至不能回答学生的问题。

我不认为OOP是为了盲目追随某些互联网喉舌毫无根据的假设而削减自己的能力,每个人都以自己的方式扫荡。

 
Artyom Trishkin:

我不认为OOP是为了盲目追随某些互联网喉舌毫无根据的假设而降低自己的能力,每个人都在用自己的方式扫荡。

如果你看过视频,你应该明白,目标是....。好吧,总的来说,你也不明白什么,还不够成熟--至少A100是这样向我解释的。

SZZ:我以后会在界面上做一些实验,也许会出现一些 "实体的美"))))。

[删除]  

我看了他的静力学视频,都是为了这样写的。

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:

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


在我看来,工作起来没有任何问题

 
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++,但它非常相似,所以初始化列表(我不知道效率如何)是合适的。