顾问的项目 - 页 5

 

George Merts
Стандартный CObject - это "объект списка или сортированного массива". CMyObject - это CObject, имеющий определенный тип, и содержащий некоторое значение, данное при его создании. Этот объект мне понадобился всвязи с повсеместным приведением объектов к базовому абстрактному классу - чтобы понимать по указателю, на какой именно объект "на самом деле" указывает. Тип CMyObject - устанавливается как раз той самой функцией SetMyObjectType(). Эта функция в обязательном порядке вызывается в конструкторах любых наследников от CMyObject, чтобы назначить идентификатор класса, к которому принадлежит создаваемый объект.

你的构造函数是开放的、非参数化的

class CTradeHistoryI: public CMyObject
{
public:
   void CTradeHistoryI() {    SetMyObjectType(MOT_TRADE_HISTORY_I); };
}

这意味着一个继承者可以设置也可以不设置自己的类型。因此,如果你忘记在子代中调用SetMyObjectType方法,你就完蛋了。

你能做什么?

1.你应该从创建外部关闭构造函数。

class CTradeHistoryI: public CMyObject
{
protected:
   void CTradeHistoryI() {    SetMyObjectType(MOT_TRADE_HISTORY_I); };
}

在这种情况下,只有 CTradeHistoryI 的后代能够创建一个实例,这意味着将不需要 MOT_TRADE_HISTORY_I 类型。请注意,MOT_TRADE_HISTORY_I类型在现实中从不存在,因为CTAHistoryI是一个接口,而且不可能有这个类型的实例。也就是说,通过关闭构造函数,我们解决了矛盾--对不存在的类型的描述

2.让我们在创建实例的时候设置明确的类型化要求。

enum ENUM_OBJ_TYPE
{
   OBJ_HIST_DEALS_LIST,
   OBJ_HIST_ORDERS_LIST
   ...
};

class CTradeHistoryI: public CMyObject
{
private:
   ENUM_OBJ_TYPE   m_obj_type;
protected:
   CTradeHistoryI(ENUM_OBJ_TYPE obj_type)
   {
      m_obj_type = obj_type;
   }
public:
   ENUM_OBJ_TYPE ObjectType(void) const
   {
      return m_obj_type;
   }
};

class CTradeHistory : public CTradeHistoryI
{
public:
   CTradeHistory(void);
};

CTradeHistory::CTradeHistory(void) : CTradeHistory(OBJ_HIST_DEALS_LIST)
{
}

就是这样,现在没有明确的类型说明,任何子孙都不能创建自己。

 
Vasiliy Sokolov:

既然有一个大家都能理解的标准CObject,为什么还要以CMyObject的形式重新发明车轮呢?

我不知道你在MQL CObject中发现了什么好处。每个对象中塞进两个不必要的指针 = 损失16个字节 +内存分配 和初始化这些指针的不必要的开销。OOP本身就会降低性能,如果再加上这种无用的解决方案...
 
Alexey Navoykov:
我不知道你在MQL的CObject中发现了什么好处。每个对象中塞进两个不必要的指针 = 浪费16个字节 +内存分配 和初始化这些指针的不必要的开销。OOP本身就会降低性能,如果再加上这种无用的解决方案...

先学习OOP,然后我们再来讨论。m_prev, m_next的初始化在一般情况下不会发生。

 
Vasiliy Sokolov:

先学习OOP,然后我们再来讨论。m_prev、m_next的初始化一般不会发生,如果有的话。

只有在你之后。

因此为了了解情况,在MQL中总是进行指针的初始化。

 
Vasiliy Sokolov:

你的构造函数是开放的、非参数化的

这意味着一个继承者可以设置也可以不设置自己的类型。因此,如果你忘记在子代中调用SetMyObjectType方法,你就完蛋了。

你能做什么?

...

是的,确实在某些情况下,我忘记了指定SetMyObjectType() - 而对象的创建默认为CMyObject类型。

而解决方法是一个很好的方法。

接受建议。

但我不喜欢受保护的构造函数。

 
George Merts:

是的,的确,在某些情况下,我忘记了指定SetMyObjectType() - 而对象的创建默认为CMyObject类型。

而解决方法是一个很好的方法。

接受建议。

虽然我不喜欢保护性构造器。

受保护的构造函数只对那些直接继承自具有这种构造函数的父类的类来说是复杂的。但在用户层面,你可以毫不犹豫地自由创建派生对象。

因此,不应该观察到这种不便。

而在MQL中没有其他的选择,因为没有类型检查系统,或者说,它存在,但形式不够成熟,所以,我们必须通过隐藏一个构造函数来保护类型。

 
Alexey Navoykov:
我不知道你在MQL的CObject中发现了什么好处。每个对象中塞进两个不必要的指针 = 损失16个字节 +内存分配 和初始化这些指针的不必要的开销。OOP本身就会降低性能,而当你在其中加入这种无用的解决方案时...

为什么 "无用"?在我看来,这种开销非常小,而且显然值得CObject在组织列表和排序数组时带来的便利。

如果我们需要追逐微秒和字节,那么当然要考虑这些非常 "丢失的字节 "是否占了太多的资源。但正如我的实践所表明的,代码编写和维护的便利性更为重要。

顺便说一下,我最近参与了代码优化 - 我的专家顾问在测试器中不知为何太慢了。最慢的功能是在数据刷新方面。所以我试图在各方面减少对这种刷新的调用。但是,最近,在测试器中对代码进行剖析成为可能。令我非常惊讶的是,我看到我的专家顾问的大部分时间都花在了请求终端状态的功能上(我不需要(几乎))(它在每次刷新时都会执行,而且只是与其他部分 "同时 "完成)。而最重要的是--浪费了请求释放内存的功能。对代码稍作修改,使终端状态在启动时只被查询一次,然后在刷新时才被明确指出,这使测试速度提高了三倍以上

因此,"不必要的开销 "可能根本就不是在我们要找的地方丢失。

 
George Merts:

因此,"不必要的开销 "在我们寻找它的地方可能根本就没有损失。

不要和他争论。他的唯一目标是咆哮。你永远无法向他这样的人证明什么。处理这种人物的最佳策略是完全无视。
 
George Merts:

为什么 "无用"?在我看来,其开销非常小,而且显然值得CObject在组织列表和排序数组方面提供的便利。

这些 "便利 "的实施是超前的。什么样的清单会改变你对象中的某些东西?实质上,事实证明,你不能把常量对象 放入列表中。或者想象一下,你的对象在这样一个列表中,你把它送到一个函数中,这个函数也把它放在它的列表中,然后你得到你的对象,并改变了上一个和下一个,然后游戏开始了......

在文明的世界里,列表是通过辅助的Node对象实现的,它存储了所需的指针。而触摸用户对象本身是无稽之谈。因此,这不仅仅是开销,而是这一切的根本不正确性。开发者只是快速地拼凑了一些东西,而你却很高兴,好像应该如此。

 
Alexey Navoykov:

这些 "便利 "是通过一个地方实现的。是什么样的清单改变了你的对象的一些东西?从本质上讲,你不能把常量对象 放入列表中。或者想象一下这种情况,当你把你的对象放在这样一个列表中发送给一个函数,这个函数也把它放在它的列表中,然后你得到你的对象,并改变了上一个和下一个,然后游戏开始了......

在文明的世界里,列表是通过辅助的Node对象实现的,它存储了所需的指针。而触摸用户对象本身是无稽之谈。因此,这不仅仅是开销,而是这一切的根本不正确性。开发商只是在短时间内拼凑了一些东西,而你却很高兴,好像它必须如此。

嗯,是的,你不能把恒定的对象放到一个列表中。

然而,我经常使用CObject的功能,而我的批评者中没有人提出任何与标准库的数组和列表的对象相似的东西。

"事情应该这样做 "是每个人的吆喝。但要提出一些建议,突然间,什么都没有了。

即使是那些实际提供不同软件解决方案的参与者,也没有提供CObject的替代品--更多的是根本不使用它,较少使用它的功能,不注意 "在一个地方实施",这意味着实施的效果相当好。

如果它是坏的,他们早就提供了一个替代品。