给OOP专家的一个问题。 - 页 6

 
Реter Konow:

代码是不可移植的 - 这是它的特殊性。它的目的不是要让人携带。它有另一个目的。那么,变量的全局范围是实现复杂机制的有力工具。你只需要知道如何使用它。当人们告诉我隐藏的错误和bug时,我感到很困惑。我从来没有遇到过任何与全局变量可见性有关的错误。一句话,完全没有。

全局变量的问题是,如果项目足够大,而且这些变量的状态变化来自于许多部分的代码,那么寻找bug是相当耗时的。

例子。发现一个错误是因为一个全局变量的值 显然不是它应该有的。该项目有几十个文件和100500行代码。没有人记得这个变量改变了多少个代码片段。其结果是喝了一罐咖啡,头卡在键盘上睡得很香。

而现在,同样的事情,但是OOP。我们已经正确编写了代码,所有字段都是私有的。因此,只有在类方法中才能直接改变它,而从外部只能通过Set方法来改变。相应地,我们把断点放在Set方法和类中有多少个方法上,哪里改变了字段,我们就可以很容易地跟踪哪里改变了,哪里改变得不对。

 
Реter Konow:

我从来没有遇到过任何与全局变量可见性有关的错误。一点也不。

我甚至不知道如何说服你,但我可能不应该这样做,我没有得到报酬,不是吗?

你想做什么? 好吧,如果你想得到赞美,那你就去吧。

彼得!干得好,继续努力。

))))

 
Vladimir Simakov:

全局变量的问题是,如果项目足够大,而且这些变量的状态变化来自于许多部分的代码,那么寻找bug是相当耗时的。

例子。发现一个错误是因为一个全局变量的值 显然不是它应该有的。该项目有几十个文件和100500行代码。没有人记得这个变量改变了多少个代码片段。其结果是喝了一罐咖啡,头卡在键盘上睡得很香。

而现在我们有同样的东西,但它是OOP。我们已经正确地编写了代码,所有的字段都是私有的。因此,它只能在类方法中直接改变,而从外部只能通过设置方法来改变。相应地,我们把断点放在Set方法和类中有多少个方法上,哪里改变了字段,我们就可以很容易地跟踪哪里改变了,哪里改变得不对。

从实践来看。我的项目中有100多个连接的文件。其中一些有超过2000行的代码。全局变量到处都在使用。 我从来没有遇到过与它们的全球性有关的任何错误。也许我只是适应了?))。也许没有bug,因为所有的变量都是俄语,所有的名字都是有意义的。没有sdf或iukj。因此,我没有与它们相关的错误。一般来说,全局变量用于全局事件标志,例如,打开一个窗口,点击鼠标按钮,展开一个古老的列表,等等。另外,为了突出重点。换句话说,鼠标穿越GUI,所有对象和元素的编号以及它们的属性被写入全局变量,所需的块被从OnChartEvent中调用,它立即对焦点中的对象和元素工作。这是很方便的。
 
Igor Makanu:

我甚至不知道如何说服你,但我可能不应该这样做,我没有得到报酬,不是吗?

你想做什么? 好吧,如果你想得到赞美,那你就去吧。

彼得,加油啊

))))

我没有取得任何成就。好吧,也许是了解到不仅是用OOP,你可以写出很酷的项目。而且,不仅仅是掌握OOP才是一个开发者的标志。我不认为你可以用OOP来解决很多任务。但也有其他方法。
 
感谢大家参加讨论。我将尝试进入OOP,以真正比较两种方法的能力。我对OOP所能提供的层次结构很感兴趣,如果它的有用性没有被埋没在其语法之下,我一定会采用它。
 
Реter Konow:
好吧,也许是对这样一个事实的理解,即不仅是用OOP你可以写出很酷的项目。而且,不仅精通OOP是一个开发者的标志。我不认为你可以用OOP来解决很多任务。但也有其他方法。

这不是关于OOP,而是关于代码编写本身的原则,这是我第二次谈到这个问题,上面@Vladimir Simakov 写了一个例子

如果你想使用全局变量的可见性--没问题,没有人禁止它,你可以这样做--但要悄悄地,在没有人注意的时候!)))

但作为一种长期使用的程序编写方式,它是邪恶的,而且代码越多,这种邪恶就越多!--你是这么解释的?)

SZY:再来一个测试镜头--看看MQL的帮助,你看到所有的功能都是作为单独的、完整的独立单元?- 通过参数=得到结果!你认为Metakvot的程序员又做错了吗? 我们应该使用一些自由的函数编写风格--这里在全局范围内,而这里用户将调用函数并得到结果!"。))))- 程序性风格(每个子程序都是一个完整的逻辑块)是正确的代码,正确地写代码!而不是正确的...好了,它会自己来的,"当你需要它的时候就会很快";)

 
Реter Konow:
从实践来看。我的项目中有100多个连接的文件。其中一些有超过2000行的代码。全局变量到处都在使用。我从来没有遇到过与它们的全球性有关的任何错误。也许我只是适应了它?))。

你只是有很好的记忆力。 不是每个人都那么幸运。我已经隐约记得我今天输入了哪些变量。我不记得一周前的哪些人了。但这不是问题,它们都是本地的,对任何对象的字段的访问都只能通过适当的函数。OOP允许我不记住很多东西,我已经不止一次说过了--理想情况下,在任何地方的代码中,你应该只访问你需要的东西,而没有更多的变量--所以即使你想,你也不能改变你不应该的东西。而当你真的需要的时候,你就得弄清楚为什么你不能访问一个变量--这只是一个疏忽,或者更多时候是一个需要额外工作才能修改的变量。如果它马上就能为你所用,你就会忘记它们,然后就会花很长时间来弄清楚为什么这个程序不能工作或不能按你的要求工作。

 
Реter Konow:
我并不是要达到什么目的。好吧,也许是了解到不仅是用OOP,你可以写出很酷的项目。而且,不仅仅是掌握OOP才是一个开发者的标志。我不认为你可以用OOP来解决很多任务。但也有其他方法。

OOP的另一个好处是,你会逐渐获得类库,尤其是真正通用的类库,它们会伴随你的一生,为你的这一生提供便利。

从一个真实的项目来看,它真的很有效。这里没有任何麻烦,你只需要监控可用订单/职位的数量和状态。这个函数只控制仓位/订单不被关闭/取消,并在关闭后将其从列表中删除。

void OrdersControl(){
   for (CTrade* it=gPos.Begine();
        it!=NULL;
        it=it.Control()?gPos.Next():gPos.Delete());}

其中gPos是CList<CTrade> gPos

CList和CTrade不是来自标准库

CTrade继承自我自己的库CPosition。

事实上,下面是你所需要的所有CTARTE,只是为了使你的项目代码可读。

#include "..\Header.mqh"

#ifndef _C_TRADE_
#define _C_TRADE_

#include "..\..\..\Shared Projects\mqlLib\Objects\Trade\CPosition.mqh"

class CTrade:public CPosition
  {
public:
                     CTrade(double mVolume,int mDirect,double mSL,double mTP);
   bool              Control() {return !( CPosition::Control()&TRADE_FINISH);}
  };
//-------------------------------------------------------------------------------------
void CTrade::CTrade(double mVolume,int mDirect,double mSL,double mTP):
   CPosition(NULL,
             mDirect>0?OP_BUY:OP_SELL,
             mVolume,
             0.0,
             mSL,
             mTP)
{}

#endif
整个订单/位置处理的实现都隐藏在跨平台的CPosition库文件中。
 
Реter Konow:
感谢大家参加讨论。我将尝试深入研究OOP,以便真正比较两种方法的能力。我对OOP所能提供的层次结构很感兴趣,如果它的有用性没有被埋没在其语法之下,我当然会采用它。

在YouTube上帮助自己。那上面有很多东西。特别是在英语方面,你很擅长。


不要放过45分钟,彼得。在开始的时候,理解这个家伙在说什么是非常重要的。很多人可能会与他争论,但他一般是对的。


 
Nikolai Semko:

在YouTube上帮助自己。那上面有很多东西。特别是在英语方面,你很擅长。


不要放过45分钟,彼得。在开始的时候,理解这个家伙在说什么是非常重要的。很多人可能会与他争论,但他一般是对的。


谢谢你,尼古拉。我将继续关注。