MQL5中的OOP问题 - 页 38

 
Nikolai Semko:

是的,我也有类似的情况。学习并不难,难的是重新训练,打破旧习惯。我仍然无法摆脱程序化编程的许多坏习惯。

嗯,如果你需要扩大项目 规模,写好的程序化风格的代码通常很容易被包装成一个类。

Dmitry Fedoseev:

你可以暂时忘记常数和静力学。甚至不要考虑接口问题。

当一切准备就绪后,就可以把一些东西标记为静态的,一些东西标记为常量的。 然后你就可以完全忘记接口。

我知道如何快速做很多事情。

我决定把时间用于研究理论,或者说把MQL提高到过去几年的水平,甚至这里很多人都不知道终端的可能性

如果我要研究材料,我需要正确地研究它,imho,并了解MQL是更接近C++还是C#--目前看来是C++。 在C#中,人们甚至不屑于使用修改器,或者说他们只是修复被工作室标记为可疑的东西))))。

 
Dmitry Fedoseev:

常数和静力学可以暂时简单地忽略。接口,也是如此。

当一切都准备好了,再看一下,把一些东西标记为静态的,一些东西标记为常量的。 然后你就可以完全忘记接口。

最主要的是保持常数和静力学。我同意关于接口的说法。

 
Igor Makanu:

嗯,写得很好的程序风格的代码被包裹在一个类中,如果你需要扩大项目规模,通常没有问题。

我知道如何做很多事情,而且速度很快。

我决定把我的时间用于研究理论,或者说把MQL提高到过去几年发展的水平,甚至这里的很多人都没有达到终端的能力。

而如果你研究材料,你必须正确地研究它,我认为,要了解MQL与C++或C#都比较接近,目前看来是C++。

const - 如果有必要禁止变量的赋值(除了一次性的初始化)。如果一个变量被声明为conts,那么当你通过引用把它传入一个函数时,函数参数也应该是const,但编译器会使之发生,你不必考虑这个问题。如果一个变量没有被分配,它也可以被标记为常量--它的工作速度会更快,这适用于函数参数。 然而,在任何时候,你可能需要修改它...

static - 如果它是一个类中的变量,那是一种罕见的情况,甚至是最罕见的。如果它是一个类方法,那么如果该方法只处理这个方法的参数和类的静态变量,这也是一种罕见的情况(不过,如果你只是为了方便而把函数收集到一个类中,就不那么罕见了)。

 
睡了吗?
 
Igor Makanu:

我想举个例子,我告诉你,我根本不擅长使用修饰语。


SZS: 同时,在Inet的编程讨论中,一般会出现什么恐怖的情况--上个月在hubra上有一篇关于const的文章,意思是--是的,这个const是没有必要的,看汇编代码没有const的区别--编译器会删除一切((

下面是一个例子。

struct SSettingsForOrder
{
   int mPeriod;
   double mTakeProfit;
   double mStopLoss;
};

class CStrategy
{
   SSettingsForOrder mSettings;
   
   bool mDirty;
   
public:
   CStrategy() : mDirty( true ){}

   CStrategy( SSettingsForOrder& set ) : mSettings( set ), mDirty( true ){}
   
   virtual void NextStepStrategy();
   
   bool IsDirty() const
   {
      return mDirty;
   }
   
   int GetPeriod() const
   {
      return mSettings.mPeriod;
   }
   void SetPeriod( int period )
   {
      if( mSettings.mPeriod != period )
      {
         mSettings.mPeriod = period;
         mDirty = true;
      }
   }
   double GetTakeProfit() const
   {
      return mSettings.mTakeProfit;
   }
   void SetTakeProfit( double takeProfit )
   {
      mSettings.mTakeProfit = takeProfit;
      mDirty = true;
   }
   double GetStopLoss() const
   {
      return mSettings.mStopLoss;
   }
   void SetStopLoss( double stopLoss )
   {
      mSettings.mStopLoss = stopLoss;
      mDirty = true;
   }
   void Load( int fileHandle )
   {
      FileReadStruct( fileHandle, mSettings );
      mDirty = false;
   }
   void Save( int fileHandle )
   {
      FileWriteStruct( fileHandle, mSettings );
      mDirty = false;
   }
};

class CStrategy_XXX : public CStrategy
{
public:
   CStrategy_XXX(){}
   CStrategy_XXX( SSettingsForOrder& set ) : CStrategy( set ){}
   
   virtual void NextStepStrategy();
};

class CStrategy_YYY : public CStrategy
{
public:
   CStrategy_YYY(){}
   CStrategy_YYY( SSettingsForOrder& set ) : CStrategy( set ){}
   
   virtual void NextStepStrategy();
};

class CStrategy_ZZZ : public CStrategy
{
public:
   CStrategy_ZZZ(){}
   CStrategy_ZZZ( SSettingsForOrder& set ) : CStrategy( set ){}
   
   virtual void NextStepStrategy();
};

CStrategy* Strategies[3];

void OnInit()
{
   Strategies[0] = new CStrategy_XXX();
   Strategies[1] = new CStrategy_YYY();
   Strategies[2] = new CStrategy_ZZZ();
   
   int fileHandle = FileOpen( ... );
   for( int i = 0; i < 3; i++ )
   {
      Strategies[i].Load( fileHandle );
   }
   FileClose( fileHandle );
}

void TestAndSave()
{
   bool saveRequired = false;
   for( int i = 0; i < 3; i++ )
   {
      if( Strategies[i].IsDirty() )
      {
         saveRequired = true;
         break;
      }
   }
   if( saveRequired )
   {
      int fileHandle = FileOpen( ... );
      for( int i = 0; i < 3; i++ )
      {
         Strategies[i].Save( fileHandle );
      }
      FileClose( fileHandle );
   }
}

void OnDeinit()
{
   TestAndSave();
   
   for( int i = 0; i < 3; i++ )
   {
      delete Strategies[i];
   }
}

从你的代码中不清楚为什么需要一个接口,所以我把它扔掉了。

当然,我并不完全了解你的任务,但有99.99%的概率是不需要的。

 
Igor Makanu:

重新学习程序化风格? 嗯,写好的程序化风格的代码被包裹在一个类中,如果你需要扩大项目规模,通常不是一个问题。

我知道如何做很多事情,而且速度很快。

我决定把我的时间用于研究理论,或者说,把MQL提高到过去几年发展的水平,甚至这里的许多人都没有达到终端的可能性

如果我要研究这些材料,我需要正确地研究它,我认为,要了解MQL与C++或与C#都比较接近--目前看来是C++。

mql本身是基于c++的,但通过其创造者的努力,他们从Sharp中实现了许多不好的东西,而没有从中增加任何好处。类似夏普的标准库 很能说明问题。如果它与std类似,看起来会更符合逻辑。IMHO。
 
Koldun Zloy:

这里有一个例子。

从你的代码来看,不清楚这个接口是干什么用的,所以我把它扔了。

我不完全了解你的任务,但99.99%肯定你不需要它。

这是我第五次听到有人说你应该扔掉接口,不要再管了。)

我把 "战略" OOP设计模板 作为基础。

按照规定,应用接口作为抽象,我从中继承基类CStrategy--事实证明,我的CStrategy将没有公共方法,所有的公共方法都由接口描述(3件=战略本身,战略完成,现在增加了战略状态的记录)。接口的作用是...嗯,和const修饰符的情况差不多--如果你不描述一个方法或者试图用继承来关闭它们,你会在一开始就得到警告--到目前为止,我得到的便利多于问题。

一般来说,我确认100%的概率是没有必要的...但CStrategy类没有一个公共部分,这很方便

你的代码看起来不错,午饭后我会在我的地方重现它,试着和我的代码进行比较。

谢谢!

 
Vladimir Simakov:
mql本身是基于c++的,但通过其创造者的努力,他们把sharp的很多坏东西都放进去了,没有增加任何好东西。类似夏普的标准库 就说明了这一点。如果它与std类似,看起来会更符合逻辑。IMHO。

也许是我在MQL论坛上开始了 "这不是C++,是MQL...... "的说法,现在有很多像你这样的问题在这种情况下的答案))))。

在一般情况下,语言是相当民主的,不方便在MQL中写 - "在2次点击",你可以去.dll C++和这里自年初在.dll C#,如果记忆犹新,从开发人员Renat的第一篇文章dll - 即这种可能性最初,作为一个产品概念提供,IMHO

SZS: 写到这里,不知为什么,我想到了一句话--我是一个艺术家--我看也是!))))。

 
Igor Makanu:


ZS:对上述内容,由于某种原因,我想到了一句话--我是一个艺术家--我看也是!)))。

这句话经常出现在开发商的回复中,是好是坏,我不知道。

如果开发者能提供信息并彻底解决问题--为什么你不能增加或改变一个功能?

 
Fast235:

这个问题经常出现在开发者的回答中,是好是坏,我不知道。

如果开发人员能够提供信息,并一劳永逸地解决这些问题--为什么不可能增加或改变一个功能?

这就是现有的企业风格,用户和IT垄断者之间的沟通,互联网上充满了用户发现微软的明显错误的案例,在向微软呼吁后得到了回应......。平时沉默不语 ))))

ZS:从最近的阅读中,Hubr "为什么Windows要读取一个文件十万次来打开一个菜单? "

Почему для открытия меню Windows читает один файл сто тысяч раз?
Почему для открытия меню Windows читает один файл сто тысяч раз?
  • habr.com
«Проводник тратит 700 мс на то, чтобы открыть контекстное меню панели задач. 75% этого времени он выполняет 114 801 операцию считывания из одного файла, средний объём считываемых данных 68 байт. Мне стоит написать пост об этом, или достаточно саркастичного твита?» За компьютером я работаю быстро, и поэтому меня раздражает, когда приходится...