MQL5의 OOP에 대한 질문 - 페이지 34

 
Koldun Zloy :

아무 이유 없이 클래스를 사용한다면 OOP가 아닙니다.

예, 이러한 가제트의 필요성을 이해할 때까지 사용하지 않는 것이 좋습니다.

그러한 접근 방식으로는 이해가 오지 않을 것입니다.
 
Alexey Viktorov :
그러한 접근 방식으로는 이해가 오지 않을 것입니다.

오용하면 이해가 올 것이라고 생각하지 않습니다.

 
Alexey Viktorov :

이고르, 차르가 페도트에게 궁수에게 준 임무를 기억하시나요?

그리고 그 덩치 큰 두 사람이 대답했습니다.

규칙이나 얻어야 할 최종 결과를 모르는 경우 어떻게 무언가를 재현하려고 할 수 있습니까?

음, 이와 같은 일이 가능합니다. 여기에 뉴스 시간과 뉴스 양이 국가마다 다르다는 모방이 있습니다.

 enum ENUM_COUNTRY {RU,EN,FR };
//+------------------------------------------------------------------+
interface INews
{   void PrintNews(); };
//+------------------------------------------------------------------+
class NewsRU: public INews
{
private :
   datetime           ru_01,ru_02,ru_03;
public :
                     NewsRU( datetime t1, datetime t2, datetime t3):ru_01(t1),ru_02(t2),ru_03(t3)   { Print ( __FUNCTION__ );}
   void               PrintNews()                                                                 { Print ( "News №1 in " ,ru_01); Print ( "News №2 in " ,ru_02); Print ( "News №3 in " ,ru_03); } };
//+------------------------------------------------------------------+
class NewsEN: public INews
{
private :
   datetime           en_01,en_02;
public :
                     NewsEN( datetime t1, datetime t2): en_01(t1),en_02(t2)                       { Print ( __FUNCTION__ );}
   void               PrintNews()                                                                { Print ( "News №1 in " ,en_01); Print ( "News №2 in " ,en_02);} };

//+------------------------------------------------------------------+
class NewsFake: public INews
{
public :
                     NewsFake() { Print ( __FUNCTION__ );}
   void               PrintNews() {} };
//+------------------------------------------------------------------+
class CCountryNews
{
private :
   INews             *arr[];
public :
                     CCountryNews(ENUM_COUNTRY &c[]);
                    ~CCountryNews()                                                            { for ( int i= 0 ; i< ArraySize (arr); i++) delete arr[i];             }
   void               PrinALLNews()                                                             { for ( int i= 0 ; i< ArraySize (arr); i++) arr[i].PrintNews();        }   };
//+------------------------------------------------------------------+
CCountryNews::CCountryNews(ENUM_COUNTRY &c[])
{   int sz = ArraySize (c);
   ArrayResize (arr,sz);
   for ( int i= 0 ; i<sz; i++)
   {   switch (c[i])
      {   case RU: arr[i] = new NewsRU(( datetime ) 111 , ( datetime ) 222 , ( datetime ) 333 );   break ;
         case EN: arr[i] = new NewsEN (( datetime ) 444 , ( datetime ) 555 );                   break ;
         default : arr[i] = new NewsFake();   
Print("Error, not this type ", EnumToString(c[i])); } } }
void OnStart ()
{  ENUM_COUNTRY arrinput[] = {RU,EN,FR };
   CCountryNews CountryNews(arrinput);
   CountryNews.PrinALLNews();
}
//+------------------------------------------------------------------+


하지만 OOP로 래핑해야 하는지 확인해야 합니다.

;)

다음은 모든 것이 호출된 방법과 결국 발생한 일에 대한 로그입니다.

2019.09.08 16:00:35.031 tst (EURUSD,H1) 뉴스RU::뉴스RU

2019.09.08 16:00:35.032 tst (EURUSD,H1) 뉴스EN::뉴스EN

2019.09.08 16:00:35.032 tst (EURUSD,H1) 뉴스가짜::뉴스가짜

2019.09.08 16:00:35.032 tst (EURUSD,H1) 오류, 이 유형이 아닙니다. FR

2019.09.08 16:00:35.032 tst (EURUSD,H1) 1970.01.01 00:01:51 뉴스 1위

2019.09.08 16:00:35.032 tst (EURUSD,H1) 뉴스 #2 1970.01.01 00:03:42

2019.09.08 16:00:35.032 tst (EURUSD,H1) 1970.01.01 00:05:33 뉴스 #3

2019.09.08 16:00:35.032 tst (EURUSD,H1) 1970.01.01 00:07:24 뉴스 1위

2019.09.08 16:00:35.032 tst (EURUSD,H1) 뉴스 #2 1970.01.01 00:09:15

 
Koldun Zloy :

오용하면 이해가 올 것이라고 생각하지 않습니다.

적어도 "여기에는 물고기가 없다"는 이해가 올 것입니다.)))
 
Alexey Viktorov :
적어도 "여기에는 물고기가 없다"는 이해가 올 것입니다.)))

우리는 일부 지역 인물들로부터 이것을 여러 번 들었습니다.

그리고 이것은 단지 오해에서 비롯된 것입니다.

그리고 물고기가 있습니다!

 
Igor Makanu :

글쎄, 이와 같은 것이 가능합니다. 여기에 뉴스 시간과 뉴스 양이 국가마다 다르다는 모방이 있습니다.


하지만 OOP로 래핑해야 하는지 확인해야 합니다.

;)

다음은 모든 것이 호출된 방법과 결국 발생한 일에 대한 로그입니다.

아니 이고르. 이것은 여기에서 접근하는 방식이 아닙니다.

 bool    CalendarValueHistory ( 
   MqlCalendarValue &  values[],               // массив для получения описаний значений  
   datetime            datetime_from,         // левая граница диапазона времени 
   datetime            datetime_to= 0            // правая граница диапазона времени 
   const string        country_code= NULL ,     // кодовое имя страны по ISO 3166-1 alpha-2 
   const string        currency= NULL            // кодовое наименование валюты страны   
   );

강조 표시된 줄은 세 가지 사용 사례입니다. 이 경우 시간 범위가 변경됩니다. 그런 다음 values[] 배열이 특정 방식으로 처리됩니다. 이벤트 ID로 이 이벤트에 대한 설명을 얻습니다. 중요성, 시간 및 기타 속성.

 
Koldun Zloy :

우리는 일부 지역 인물들로부터 이것을 여러 번 들었습니다.

그리고 이것은 단지 오해에서 비롯된 것입니다.

그리고 물고기가 있습니다!

나는 그것에 대해 읽었습니다. 물고기가 있지만 이해하지 못하는 곳은 없습니다. 음, 이것은 mql5 프로젝트 가 여기에 있어야 물고기가 있어야 하는 것입니다 ... 최소한 OOP가 필요한 mql5에서 하나의 프로젝트를 참조하십시오.
 
Alexey Viktorov :
나는 그것에 대해 읽었습니다. 물고기가 있지만 이해하지 못하는 곳은 없습니다. 글쎄, 이것은 물고기가 여기에 있도록 mql5 프로젝트가 같아야 하는 것입니다 ... 최소한 OOP가 필요한 mql5에서 하나의 프로젝트를 참조하십시오.

OOP가 필요하지 않다는 것입니다. 원칙적으로 모든 것이 구조적 스타일로 수행될 수 있습니다. 그러나 개인적으로 첫 번째 충동은 전역 변수 집합 대신 구조를 사용하기로 결정했을 때 시작되었으며 그 수가 무섭게 증가하기 시작했습니다. 글쎄요, 저는 이미 구조에서 클래스로 이동했습니다. 이러한 구조의 데이터를 처리하는 기능을 직접 통합하여 클래스를 생성하는 것이 논리적이기 때문입니다. 이것은 필연적인 문제가 아니라 단순히 데이터를 구성하고 작업하는 문제입니다.

 
BlackTomcat :
객체가 생성 되어 작업을 완료 한 직후에 객체를 "종료"할 필요는 없습니다.
MQL 프로그램이 완료되면 OnDeinit 함수에서 생성된 객체를 "종료"할 수 있습니다.
프로그램이 실행되는 동안 모든 개체는 메모리에 있고 액세스할 수 있습니다.

객체가 목적을 달성했다면 왜 메모리에 보관합니까?
메모리 누수가 발생합니까?

 
Alexey Viktorov :

아니 이고르. 이것은 여기에서 접근하는 방식이 아닙니다.

강조 표시된 줄은 세 가지 사용 사례입니다. 이 경우 시간 범위가 변경됩니다. 그런 다음 values[] 배열이 특정 방식으로 처리됩니다. 이벤트 ID로 이 이벤트에 대한 설명을 얻습니다. 그 중요성, 시간 및 기타 속성.

접근 방식은 중요하지 않습니다.

OOP를 이해하고 싶다면 내 의견(이미 쓴)이 편리하지만 OOP는 패러다임일 뿐이며 여러 OOP 개념을 결합한 작성 방법입니다. - Wiki...


일반적으로 반대로 시도할 수 있습니다. 여기에 작업이 있습니다. 데이터와 데이터 처리 방법으로 나누어야 합니다...

1. 데이터를 어디에 저장할 것인가? - 아마도 이것이 구조일 것입니다.

2. 데이터를 어떻게 처리할 것인가? - 대부분은 함수의 집합일 가능성이 큽니다.

3. 데이터를 어떻게 초기화할 것인가? - 이것은 구조의 배열일 가능성이 높으며 이 배열을 재설정한 다음 데이터로 채워야 합니다.

4. 이전에 작성한 코드의 유연성을 어떻게 보장할 것인가 - 리팩토링?

이제 OOP를 사용하는 경우:

1. 클래스의 필드에서 이 필드는 구조일 수 있습니다. 또는 데이터를 저장하고 상속하는 기본 클래스를 작성하거나 이 클래스가 지금 논의 중인 클래스의 필드가 될 수 있습니다.

2.1. 그것은 일련의 메서드가 될 것이며 기본 클래스를 작성하면 기본 클래스에서 데이터로 가장 간단한 작업을 수행하는 메서드를 만들고 기본 클래스에서 상속하면 이러한 메서드를 사용할 수 있습니다. 이 클래스에서 - 이것은 상속입니다!

2.2. 기본 클래스에서 상속한 후 하나의 메서드만 변경하려는 경우 기본 클래스에서 아무 것도 다시 작성하지 않습니다. 이것은 필요하지 않습니다! - 베이스 클래스의 메소드로 일대일 호출되는 메소드(함수!)를 작성하면 상속이 됩니다!

3. 그것은 생성자가 될 것이고, 만약 내가 생성자를 작성하지 않았다면 암시적으로 호출될 것이므로, 내가 상속받은 모든 클래스 및/또는 내 필드의 클래스에는 항상 , 그리고 OOP는 생성자를 작성하지 않고 매개변수 없이 생성자를 작성하고 매개변수가 있는 12개 이상의 생성자를 작성할 수 있는 기회를 제공합니다.

4. OOP를 사용하면 이전에 생성된 코드 섹션을 다시 작성할 필요가 없습니다. 상속할 수 있습니다. 할 수 있습니다. .... 망칠 수 있습니다. 컴파일러는 대부분의 경우 프로그래머 이후에 정리할 것입니다!


휴, 음, 이것은 OOP에 대한 다소 아마추어적인 견해입니다. 일반적으로 편리하고 모든 것이 효과적으로 작동하기 위해 OOP를 사용할 때 주요 작업은 프로그래머가 아니라 컴파일러 개발자를 위한 것이므로 어느 필드 / 메소드는 사용되지 않습니다 컴파일된 파일에 포함되지 않습니다. 프로그래머가 엉망인 경우, 글쎄, 그에게 경고합니다)))