在休息室谈论巴解组织的问题 - 页 5

 
Alexey Volchanskiy:

我看了大家的不同兴趣......我目前正在重新设计一个虚拟 网格的阐述和控制的 类,我需要它。

我已经在复制构造函数和赋值运算符上挣扎了2天。这是一个复杂的类,其数据成员以指针形式存在...

 
Dennis Kirichenko:

我已经在复制构造函数和赋值运算符上挣扎了2天。有一个复杂的类,其数据成员以指针形式存在...

我似乎写的是非常原始的东西......

 
Dennis Kirichenko:

你可以使用一个 指向函数的指针。

用虚拟函数会这样吗?

我一直不喜欢内部的函数指针。 我现在不记得为什么,在 "纯C "中工作时--函数指针被使用。但当我改用C++时,由于某种原因,我不得不放弃它们。从那时起,我就没有再使用过它们。一个指针--它必须是指向一个对象。

但我不会说我是 "绝对正确 "的。我同意,我身上有很多老式的老式经验。

 
fxsaber:

我似乎写的是非常原始的东西......

不要谦虚。

我认为没有人能够比得上你对定义的高超运用。

 
George Merts:


...对我来说,这个功能看起来像这样。

int CFactoryBalanceResultSeries::Compare(const CObject *poNode,const int iMode) const
{
   CFactoryBalanceResultSeries* pfdsAnother = CONVERT_OBJECT_WITH_CHECK(poNode,CFactoryBalanceResultSeries,MOT_FACTORYBALANCERES_SERIES);
   
   switch(iMode)
      {
      case FSM_BY_PART_OF_MAX_DD_A:    return(_CompareByPartOfMaxDDWith(pfdsAnother,true));
      case FSM_BY_PART_OF_MAX_DD_D:    return(_CompareByPartOfMaxDDWith(pfdsAnother,false));

      case FSM_BY_PART_OF_MAX_SLQUEUE_A: return(_CompareByPartOfMaxSLQueueWith(pfdsAnother,true));
      case FSM_BY_PART_OF_MAX_SLQUEUE_D: return(_CompareByPartOfMaxSLQueueWith(pfdsAnother,false));

      case FSM_BY_LAST_PRCDATA_A:      return(_CompareByLastPrcdataWith(pfdsAnother,true));
      case FSM_BY_LAST_PRCDATA_D:      return(_CompareByLastPrcdataWith(pfdsAnother,false));
      case FSM_BY_LAST_MNYDATA_A:      return(_CompareByLastMnydataWith(pfdsAnother,true));
      case FSM_BY_LAST_MNYDATA_D:      return(_CompareByLastMnydataWith(pfdsAnother,false));
      case FSM_BY_LAST_MNYLOTDATA_A:   return(_CompareByLastMnylotdataWith(pfdsAnother,true));
      case FSM_BY_LAST_MNYLOTDATA_D:   return(_CompareByLastMnylotdataWith(pfdsAnother,false));
      
      case FSM_BY_PRCYEARRECOVERY_A:   return(_CompareByYearPrcrecoveryWith(pfdsAnother,true));
      case FSM_BY_PRCYEARRECOVERY_D:   return(_CompareByYearPrcrecoveryWith(pfdsAnother,false));
      case FSM_BY_MNYYEARRECOVERY_A:   return(_CompareByMnyYearRecoveryWith(pfdsAnother,true));
      case FSM_BY_MNYYEARRECOVERY_D:   return(_CompareByMnyYearRecoveryWith(pfdsAnother,false));
      case FSM_BY_MNYLOTYEARRECOVERY_A:return(_CompareByMnylotYearRecoveryWith(pfdsAnother,true));
      case FSM_BY_MNYLOTYEARRECOVERY_D:return(_CompareByMnylotYearRecoveryWith(pfdsAnother,false));
      
      case FSM_BY_PRCVAR_A:            return(_CompareByPrcVarWith(pfdsAnother,true));
      case FSM_BY_PRCVAR_D:            return(_CompareByPrcVarWith(pfdsAnother,false));
      case FSM_BY_MNYVAR_A:            return(_CompareByMnyVarWith(pfdsAnother,true));
      case FSM_BY_MNYVAR_D:            return(_CompareByMnyVarWith(pfdsAnother,false));
      case FSM_BY_MNYLOTVAR_A:         return(_CompareByMnylotVarWith(pfdsAnother,true));
      case FSM_BY_MNYLOTVAR_D:         return(_CompareByMnylotVarWith(pfdsAnother,false));
      
      case FSM_BY_PRC_GRAILRATIO_A:    return(_CompareByPrcGrailratioWith(pfdsAnother,true));
      case FSM_BY_PRC_GRAILRATIO_D:    return(_CompareByPrcGrailratioWith(pfdsAnother,false));

      case FSM_BY_MAGIC_A:             return(_CompareByMagicWith(pfdsAnother,true));
      case FSM_BY_MAIGC_D:             return(_CompareByMagicWith(pfdsAnother,false));
      default:
         break;
      };
         
   return(NULL);
};

乔治,你在这里看不到_CompareByPrcVarWith()是一个类方法还是一个普通函数,例如。在C++中,有指向类方法的指针。他们在那里有自己的具体情况。说实话,我还没有尝试在MQL5中使用这种指针。

但我认为,你仍然有一个改进代码结构的储备。

毕竟,什么是函数?

功能lat.functio,"执行,表现;职责")是一种元素之间的关系,其中一个元素的变化会引起另一个元素的变化

它是一个做某事的函数。同样的行动应该被合并到一个函数的主体中。

在你的例子中,很明显,函数

_CompareByPartOfMaxDDWith()。

_CompareByPartOfMaxSLQueueWith()。

_CompareByLastPrcdataWith()。

_CompareByLastMnydataWith(),等等。

做一个COMPARISE并给出这个比较的结果。它们在名称上有所不同。我认为,这不是一个好的 做法。他们应该通过参数来区分自己。

所以。我认为你应该把所有的函数合并成一个,或者把它们变成虚拟方法,或者模板方法。显然,这些班级必须遵循 "父母-儿子 "的层次结构。

一般来说,写复杂的代码非常容易,写简单的代码则非常困难

 
Dennis Kirichenko:

乔治,你在这里看不到_CompareByPrcVarWith()是一个类方法还是一个普通函数。在C++中,有指向类方法的指针。他们在那里有自己的具体情况。老实说,我还没有尝试在MQL5中使用这种指针。

这个(以及所有以下划线开头的)是该类的一个受保护的函数。

他们从事ARRANGEMENT工作,并给出了这种比较的结果。它们在名称上有所不同。我认为,这不是一个好的 做法。他们最好在参数上有所不同。

所以。我认为你应该把所有的函数合并成一个,或者把它们变成虚拟方法,或者模板方法。显然,这些班级必须遵循 "父-子 "的层次结构。

好了,他们都合并成一个了!

只有一个函数--Compare(),但它必须与传递的键进行比较。相应地,我们选择其中一个具体的保护者功能。这就是为什么它们被保护起来(protected),这样用户就不能访问它们--它们只能从Compare()中调用,这一点用下划线表示。

这也是代码设计 规则之一--以下划线开头的函数不打算被用户调用,它只为某些课内任务服务。对它的访问是受限制的。

 
Dennis Kirichenko:

我已经在复制构造函数和赋值运算符上挣扎了2天。有一个复杂的类,其数据成员以指针的形式存在...


丹尼斯,我想说的是,每个人都有不同的方法。事实上,当我昨天打开这个话题时,我很想看看昨天的抱怨者是否会出现,就像 "a-a-a OOP非常复杂,SB是一个可怕的黑盒子 "一样。他们没有出现,这也是意料之中的事。

但是人们已经出现了,而且每个人都有不同的方法。就共享项目 而言,这也很有趣,雷纳特谈了这么多。

ZS:在项目中的共享仍然不工作,最近试过。

 
George Merts:

这个(以及所有以下划线开头的)是类的保护函数。

好了,他们合二为一了!

只有一个函数--Compare(),但它必须对传递的键进行比较。相应地,选择一个特定的被抗议的函数。这就是为什么它们被保护起来(protected),这样用户就不能访问它们--它们只能从Compare()中调用,这一点用下划线表示。

这也是代码设计 规则之一--以下划线开头的函数不打算被用户调用,它只为某些课内任务服务。对它的访问是受限制的。


如果你有许多_CompareXXX()方法,它们是如何合并的?而按照我的理解,应该有1个。

问题是,例如,除了 CFactoryBalanceResultSeries::Compare(),_CompareByPartOfMaxDDWith()方法是否在其他地方调用

 
Dennis Kirichenko:

如果你有许多_CompareXXX()方法,你如何进行合并?而按照我的理解,应该有1个。

问题是,例如,除了 CFactoryBalanceResultSeries::Compare(),_CompareByPartOfMaxDDWith()方法是否在其他地方调用

如果_CompareXXX()方法是一个,它与原来的Compare()虚拟函数没有区别。

重点是,_CompareBy...()方法只从主Compare()中调用。而开头的下划线则警告了这一点。

Compare()一般方法接受两个对象的指针和指定比较的键。在这个一般的方法中,对钥匙进行分析,然后调用特定的方法,该方法只为比较一个钥匙而设计。此外,这些方法中的每一个都会计算两个传来的对象的键值,并根据键是int、double、bool还是string--调用具体类型的比较方法(也是保护的)。

所有的方法_CompareBy...() - 我们可以写在一个函数中。但在我看来,那样的话,代码的可读性就会变差。

 
George Merts:

如果只有一个_CompareXXX()方法,它与原来的Compare()虚拟函数没有区别。

重点是,_CompareBy...()方法只从主Compare()中调用。而开头的下划线则警告了这一点。

Compare()一般方法接受两个对象的指针和指定比较的键。在这个一般的方法中,对钥匙进行分析,然后调用特定的方法,该方法只为比较一个钥匙而设计。这些方法中的每一个都是计算两个传来的对象的键值,根据键值是int、double、bool还是string--它被称为具体类型的比较方法(也被保护)。

所有的_CompareBy...()方法都可以写在一个函数中。但在我看来,那样的话,代码的可读性就会变差。


我明白你的意思。我想这是一个品味问题。但我想用一种方法做所有的事情。特别是,如果受保护的和私有的方法除了Compare() 以外没有在其他地方被调用。

原因: