int CFactoryBalanceResultSeries::Compare(const CObject *poNode,constint 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);
};
我看了大家的不同兴趣......我目前正在重新设计一个虚拟 网格的阐述和控制的 类,我需要它。
我已经在复制构造函数和赋值运算符上挣扎了2天。这是一个复杂的类,其数据成员以指针形式存在...
我已经在复制构造函数和赋值运算符上挣扎了2天。有一个复杂的类,其数据成员以指针形式存在...
我似乎写的是非常原始的东西......
你可以使用一个 指向函数的指针。
用虚拟函数会这样吗?
我一直不喜欢内部的函数指针。 我现在不记得为什么,在 "纯C "中工作时--函数指针被使用。但当我改用C++时,由于某种原因,我不得不放弃它们。从那时起,我就没有再使用过它们。一个指针--它必须是指向一个对象。
但我不会说我是 "绝对正确 "的。我同意,我身上有很多老式的老式经验。
我似乎写的是非常原始的东西......
不要谦虚。
我认为没有人能够比得上你对定义的高超运用。
...对我来说,这个功能看起来像这样。
乔治,你在这里看不到_CompareByPrcVarWith()是一个类方法还是一个普通函数,例如。在C++中,有指向类方法的指针。他们在那里有自己的具体情况。说实话,我还没有尝试在MQL5中使用这种指针。
但我认为,你仍然有一个改进代码结构的储备。
毕竟,什么是函数?
功能(lat.functio,"执行,表现;职责")是一种元素之间的关系,其中一个元素的变化会引起另一个元素的变化。
它是一个做某事的函数。同样的行动应该被合并到一个函数的主体中。
在你的例子中,很明显,函数
_CompareByPartOfMaxDDWith()。
_CompareByPartOfMaxSLQueueWith()。
_CompareByLastPrcdataWith()。
_CompareByLastMnydataWith(),等等。
做一个COMPARISE并给出这个比较的结果。它们在名称上有所不同。我认为,这不是一个好的 做法。他们应该通过参数来区分自己。
所以。我认为你应该把所有的函数合并成一个,或者把它们变成虚拟方法,或者模板方法。显然,这些班级必须遵循 "父母-儿子 "的层次结构。
一般来说,写复杂的代码非常容易,写简单的代码则非常困难。
乔治,你在这里看不到_CompareByPrcVarWith()是一个类方法还是一个普通函数。在C++中,有指向类方法的指针。他们在那里有自己的具体情况。老实说,我还没有尝试在MQL5中使用这种指针。
这个(以及所有以下划线开头的)是该类的一个受保护的函数。
他们从事ARRANGEMENT工作,并给出了这种比较的结果。它们在名称上有所不同。我认为,这不是一个好的 做法。他们最好在参数上有所不同。
所以。我认为你应该把所有的函数合并成一个,或者把它们变成虚拟方法,或者模板方法。显然,这些班级必须遵循 "父-子 "的层次结构。
好了,他们都合并成一个了!
只有一个函数--Compare(),但它必须与传递的键进行比较。相应地,我们选择其中一个具体的保护者功能。这就是为什么它们被保护起来(protected),这样用户就不能访问它们--它们只能从Compare()中调用,这一点用下划线表示。
这也是代码设计 规则之一--以下划线开头的函数不打算被用户调用,它只为某些课内任务服务。对它的访问是受限制的。
我已经在复制构造函数和赋值运算符上挣扎了2天。有一个复杂的类,其数据成员以指针的形式存在...
丹尼斯,我想说的是,每个人都有不同的方法。事实上,当我昨天打开这个话题时,我很想看看昨天的抱怨者是否会出现,就像 "a-a-a OOP非常复杂,SB是一个可怕的黑盒子 "一样。他们没有出现,这也是意料之中的事。
但是人们已经出现了,而且每个人都有不同的方法。就共享项目 而言,这也很有趣,雷纳特谈了这么多。
ZS:在项目中的共享仍然不工作,最近试过。
这个(以及所有以下划线开头的)是类的保护函数。
好了,他们合二为一了!
只有一个函数--Compare(),但它必须对传递的键进行比较。相应地,选择一个特定的被抗议的函数。这就是为什么它们被保护起来(protected),这样用户就不能访问它们--它们只能从Compare()中调用,这一点用下划线表示。
这也是代码设计 规则之一--以下划线开头的函数不打算被用户调用,它只为某些课内任务服务。对它的访问是受限制的。
如果你有许多_CompareXXX()方法,它们是如何合并的?而按照我的理解,应该有1个。
问题是,例如,除了 CFactoryBalanceResultSeries::Compare(),_CompareByPartOfMaxDDWith()方法是否在其他地方调用?
如果你有许多_CompareXXX()方法,你如何进行合并?而按照我的理解,应该有1个。
问题是,例如,除了 CFactoryBalanceResultSeries::Compare(),_CompareByPartOfMaxDDWith()方法是否在其他地方调用?
如果_CompareXXX()方法是一个,它与原来的Compare()虚拟函数没有区别。
重点是,_CompareBy...()方法只从主Compare()中调用。而开头的下划线则警告了这一点。
Compare()一般方法接受两个对象的指针和指定比较的键。在这个一般的方法中,对钥匙进行分析,然后调用特定的方法,该方法只为比较一个钥匙而设计。此外,这些方法中的每一个都会计算两个传来的对象的键值,并根据键是int、double、bool还是string--调用具体类型的比较方法(也是保护的)。
所有的方法_CompareBy...() - 我们可以写在一个函数中。但在我看来,那样的话,代码的可读性就会变差。
如果只有一个_CompareXXX()方法,它与原来的Compare()虚拟函数没有区别。
重点是,_CompareBy...()方法只从主Compare()中调用。而开头的下划线则警告了这一点。
Compare()一般方法接受两个对象的指针和指定比较的键。在这个一般的方法中,对钥匙进行分析,然后调用特定的方法,该方法只为比较一个钥匙而设计。这些方法中的每一个都是计算两个传来的对象的键值,根据键值是int、double、bool还是string--它被称为具体类型的比较方法(也被保护)。
所有的_CompareBy...()方法都可以写在一个函数中。但在我看来,那样的话,代码的可读性就会变差。
我明白你的意思。我想这是一个品味问题。但我想用一种方法做所有的事情。特别是,如果受保护的和私有的方法除了Compare() 以外没有在其他地方被调用。