MQL5中的OOP问题 - 页 34

 
Koldun Zloy:

如果你用类来做你不了解的事情,那就不是OOP。

是的,我建议你,在你理解这些噱头的必要性之前,不要使用它们。

采用这样的方法,理解就永远不会到来。
 
Alexey Viktorov:
用这种方法,理解永远不会到来。

我不认为在使用不当的情况下,理解就会到来。

 
Alexey Viktorov:

伊戈尔,你还记得沙皇给斯特莱尔茨的费多特的任务吗?

那两个年轻人的回答是什么呢?

如果你不知道规则,或者不知道要得到的最终结果,你怎么能尝试复制一些东西呢?

嗯,差不多了,这里模仿的是新闻时间和新闻量因国家而异的事实。

enum ENUM_COUNTRY {RU,EN,FR };
//+------------------------------------------------------------------+
interface INews
{  void PrintNews(); };
//+------------------------------------------------------------------+
class NewsRU:public INews
{
private:
   datetime          ru_01,ru_02,ru_03;
public:
                     NewsRU(datetime t1,datetime t2,datetime t3):ru_01(t1),ru_02(t2),ru_03(t3)   { Print(__FUNCTION__);}
   void              PrintNews()                                                                 { Print("News №1 in ",ru_01); Print("News №2 in ",ru_02); Print("News №3 in ",ru_03); } };
//+------------------------------------------------------------------+
class NewsEN:public INews
{
private:
   datetime          en_01,en_02;
public:
                     NewsEN(datetime t1,datetime t2): en_01(t1),en_02(t2)                       { Print(__FUNCTION__);}
   void              PrintNews()                                                                { Print("News №1 in ",en_01); Print("News №2 in ",en_02);} };

//+------------------------------------------------------------------+
class NewsFake:public INews
{
public:
                     NewsFake() { Print(__FUNCTION__);}
   void              PrintNews() {} };
//+------------------------------------------------------------------+
class CCountryNews
{
private:
   INews             *arr[];
public:
                     CCountryNews(ENUM_COUNTRY &c[]);
                    ~CCountryNews()                                                            { for(int i=0; i<ArraySize(arr); i++) delete arr[i];             }
   void              PrinALLNews()                                                             { for(int i=0; i<ArraySize(arr); i++) arr[i].PrintNews();        }   };
//+------------------------------------------------------------------+
CCountryNews::CCountryNews(ENUM_COUNTRY &c[])
{  int sz = ArraySize(c);
   ArrayResize(arr,sz);
   for(int i=0; i<sz; i++)
   {  switch(c[i])
      {  case RU: arr[i] = new NewsRU((datetime)111, (datetime)222, (datetime)333 );   break;
         case EN: arr[i] = new NewsEN ((datetime)444, (datetime)555);                  break;
         default: arr[i] = new NewsFake();   
Print("Error, not this type ", EnumToString(c[i])); } } }
void OnStart()
{  ENUM_COUNTRY arrinput[] = {RU,EN,FR };
   CCountryNews CountryNews(arrinput);
   CountryNews.PrinALLNews();
}
//+------------------------------------------------------------------+


但你是否需要用PLO来包装它,还有待观察。

;)

这里有一份关于如何调用和最终结果的记录。

2019.09.08 16:00:35.031 tst (EURUSD,H1) NewsRU::NewsRU

2019.09.08 16:00:35.032 tst (EURUSD,H1) NewsEN::NewsEN

2019.09.08 16:00:35.032 tst (EURUSD,H1) NewsFake::NewsFake

2019.09.08 16:00:35.032 tst (EURUSD,H1) 错误,不是这种类型的FR

2019.09.08 16:00:35.032 tst (EURUSD,H1) News #1 in 1970.01.01 00:01:51

2019.09.08 16:00:35.032 tst (EURUSD,H1) News #2 in 1970.01.01 00:03:42

2019.09.08 16:00:35.032 tst (EURUSD,H1) News #3 in 1970.01.01 00:05:33

2019.09.08 16:00:35.032 tst (EURUSD,H1) News #1 in 1970.01.01 00:07:24

2019.09.08 16:00:35.032 tst (EURUSD,H1) News #2 in 1970.01.01 00:09:15

 
Koldun Zloy:

我不认为在使用不当的情况下,理解就会到来。

至少,人们会理解到 "这里没有鱼")。
 
Alexey Viktorov:
至少会有一个理解,"这里没有鱼"))。

我们已经从一些当地的人物那里多次听到这样的话。

而这只是因为缺乏了解。

而且还有鱼!

 
Igor Makanu:

好了,就这些了,这里是一个模拟,不同国家的新闻时间和新闻数量是不同的。


但你是否需要用OOP来包装它,还有待观察。

;)

这里有一份日志,记录了所有东西是如何被调用的,以及最后的结果是什么。

不,伊戈尔。这不是这样一种方法。

bool  CalendarValueHistory( 
   MqlCalendarValue&  values[],              // массив для получения описаний значений  
   datetime           datetime_from,         // левая граница диапазона времени 
   datetime           datetime_to=0          // правая граница диапазона времени 
   const string       country_code=NULL,     // кодовое имя страны по ISO 3166-1 alpha-2 
   const string       currency=NULL          // кодовое наименование валюты страны  
   );

突出显示的字符串是三个用例。同时,时间范围也在变化。然后,values[]数组被以某种方式处理。事件ID用于获取该事件的描述。其重要性、时间和其他属性。

 
Koldun Zloy:

我们已经从一些当地的人物那里多次听到这样的话。

而这只是因为缺乏了解。

而且还有鱼!

我读到过这个消息。有鱼,但不是在你不明白的地方。什么样的项目 应该在mql5中才会有鱼...我想在mql5中至少看到一个项目,在那里会看到对OOP的需求。
 
Alexey Viktorov:
我读到过这个消息。有鱼,但不是在你不明白的地方。什么样的项目应该在mql5中才会有鱼...我想在mql5中至少看到一个项目,在那里会看到对OOP的需求。

也许,没有必要进行OOP。原则上,一切都可以用结构化的方式进行。但就我个人而言,我的第一次冲动是从我决定使用结构而不是全局变量 集开始的,全局变量 集已经开始危险地增长。我已经从结构转向了类,因为将处理这些结构中的数据的函数直接集成到结构中去似乎是合乎逻辑的,这就导致了类的产生。这不是一个必要的问题,而是简单地安排数据并与它们一起工作。

 
BlackTomcat:
没有必要在对象被创建 并完成其工作 后立即 "杀死 "它。
创建的对象可以在MQL-程序完成后,在OnDeinit函数中被 "杀死"。
当程序运行时,所有的对象都可能被保存在内存中,并可以被访问。

如果对象已经完成了它的任务,为什么还要把它留在内存中?
不会发生内存泄漏吗?

 
Alexey Viktorov:

不,伊戈尔。这不是这里的做法。

突出显示的线条是三个用例。在这种情况下,时间范围会发生变化。然后,values[]数组被以某种方式处理。事件ID用于获取该事件的描述。其重要性、时间和其他属性。

方法并不重要

如果你想了解OOP,我的观点(我已经写过了)--它很方便,但OOP只是一种范式,嗯,一种写作方式,它结合了几个OOP概念--Wiki...


所以你可以尝试相反的方法:这是你的任务,你需要把它分解成数据和处理数据的方法......

1.你将把数据储存在哪里?- 很可能是一个结构

2.你将如何处理这些数据?- 最有可能的是一组函数。

3.你将如何初始化数据?- 很可能是一个结构数组,你需要将这个数组归零,然后用数据填充它。

4.你将如何确保以前编写的代码的灵活性 - 重构?

现在,如果你使用OOP。

1.在一个类的字段中,尽管也许这个字段将是一个结构,或者也许我将写一个基类,它将存储数据并进行继承,或者这个类将是现在讨论的类中的一个字段。

2.1.它将是一组方法。 如果我写一个基类,我可能会在基类中创建一些方法来进行基本的数据处理,如果我从基类中继承,这些方法将在类中可用--这就是继承

2.2.如果我从基类继承后只想改变一个方法,我不会在基类中重写任何东西,这是没有必要的。- 我只需写一个与基类的方法同名的方法(一个函数!),就可以实现继承了。

3.它将是一个构造函数,如果我不写一个构造函数,它将被隐式调用,所以我牢记,我从我的领域中继承的每一个类和/或类总是会有一个构造函数被调用;而且OOP给了我不写一个构造函数、写一个没有参数的构造函数、再写一打有参数的构造函数的能力

4.使用OOP,你不必重写以前创建的代码片段,你可以继承,你可以....你可能会搞砸,但在大多数情况下,编译器会在程序员之后进行清理!


好吧,这是我对OOP比较业余的看法,总的来说,它很方便,为了使一切有效地工作,在使用OOP时,主要的工作不是程序员,而是编译器开发人员,所以,字段/方法不使用不包括在编译的文件中,在程序员犯错误的地方,好吧,警告他)))。