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

 
Nikolai Semko :

네 저도 비슷한 상황입니다. 배우는 것은 어렵지 않으며, 다시 배우고 오래된 습관을 깨는 것이 더 어렵습니다. 나는 여전히 절차적 프로그래밍의 많은 나쁜 습관을 버릴 수 없습니다.

절차적 스타일에서 다시 배우나요? 흠, 절차적 스타일로 잘 작성된 코드는 클래스에 래핑될 수 있습니다 . 프로젝트 를 확장해야 하는 경우 일반적으로 문제가 없습니다.

드미트리 페도세예프 :

지금은 상수와 정적에 대해 잊어도 됩니다. 인터페이스에도.

그러나 모든 것이 준비되면 어떤 것은 정적인 것으로, 어떤 것은 상수로 보고 표시하십시오. 그리고 인터페이스에서는 일반적으로 망치질할 수 있습니다.

나는 많은 것을 빨리 할 수 있다

나는 이것을 이론 연구에 바치기로 결정했습니다. 오히려 MQL을 최근 몇 년 동안 등장한 것으로 가져오기 위해 여기에서도 많은 사람들이 터미널의 기능을 인식하지 못합니다.

그리고 당신이 자료를 연구한다면, 당신은 그것을 올바르게 연구해야 합니다. IMHO, 그리고 MQL이 C++ 또는 여전히 C#에 더 가까운 것을 이해해야 합니다. 수식어를 사용하지 않거나 오히려 스튜디오가 의심스러운 것으로 표시하고 최대값이 정확함)))

 
Dmitry Fedoseev :

지금은 상수와 정적에 대해 잊어도 됩니다. 인터페이스에도.

그러나 모든 것이 준비되면 어떤 것은 정적인 것으로, 어떤 것은 상수로 보고 표시하십시오. 그리고 인터페이스에서는 일반적으로 망치질할 수 있습니다.

가장 중요한 것은 상수와 정적이 유지되어야 한다는 것입니다. 인터페이스에 대해 동의합니다.

 
Igor Makanu :

절차적 스타일에서 다시 배우나요? 흠, 절차적 스타일로 잘 작성된 코드는 클래스에 래핑될 수 있습니다. 프로젝트를 확장해야 하는 경우 일반적으로 문제가 없습니다.

나는 많은 것을 빨리 할 수 있다

나는 이것을 이론 연구에 바치기로 결정했습니다. 오히려 MQL을 최근 몇 년 동안 등장한 것으로 가져오기 위해 여기에서도 많은 사람들이 터미널의 기능을 인식하지 못합니다.

그리고 당신이 자료를 연구한다면, 당신은 그것을 올바르게 연구해야 합니다. IMHO, 그리고 MQL이 C++ 또는 여전히 C#에 더 가까운 것을 이해해야 합니다. 수식어를 사용하지 않거나 오히려 스튜디오가 의심스러운 것으로 표시하고 최대값이 정확함)))

const - 변수에 대한 할당을 금지해야 하는 경우(초기화 중 한 번 제외). 변수가 cont로 선언된 경우 참조에 의해 함수에 전달할 때 함수 인수도 const여야 하지만 컴파일러는 강제로 변수에 대해 생각할 필요가 없습니다. 변수가 할당되지 않은 경우 const로 표시할 수도 있습니다. 더 빠르게 작동하며 이는 함수 인수에 적용됩니다. 그러나 언제든지 수정이 필요할 수 있습니다 ...

static - 이것이 클래스의 변수인 경우 이것은 드문 경우이며 가장 드문 경우입니다. 클래스 메서드라면 이 메서드의 인자와 정적 클래스 변수 만 메서드 내에서 처리한다면 이것도 드문 경우다. 클래스).

 
우리 자고 있어?
 
Igor Makanu :

예를 들면 일반적으로 수정자를 사용하는 데 문제가 있습니다.


추신: 인터넷에서 더욱 그렇습니다. 일반적으로 프로그래밍에 대한 토론에서 벌어지는 일에 대한 공포 - 지난 달 Habré에 const에 대한 기사가 있었습니다. 요점은 - 예, 이 const는 필요하지 않습니다. 어셈블러 코드는 const가 없는 것과 다르지 않습니다. 컴파일러는 모든 것을 제거합니다(((

다음은 예입니다.

 struct SSettingsForOrder
{
   int mPeriod;
   double mTakeProfit;
   double mStopLoss;
};

class CStrategy
{
   SSettingsForOrder mSettings;
   
   bool mDirty;
   
public :
   CStrategy() : mDirty( true ){}

   CStrategy( SSettingsForOrder& set ) : mSettings( set ), mDirty( true ){}
   
   virtual void NextStepStrategy();
   
   bool IsDirty() const
   {
       return mDirty;
   }
   
   int GetPeriod() const
   {
       return mSettings.mPeriod;
   }
   void SetPeriod( int period )
   {
       if ( mSettings.mPeriod != period )
      {
         mSettings.mPeriod = period;
         mDirty = true ;
      }
   }
   double GetTakeProfit() const
   {
       return mSettings.mTakeProfit;
   }
   void SetTakeProfit( double takeProfit )
   {
      mSettings.mTakeProfit = takeProfit;
      mDirty = true ;
   }
   double GetStopLoss() const
   {
       return mSettings.mStopLoss;
   }
   void SetStopLoss( double stopLoss )
   {
      mSettings.mStopLoss = stopLoss;
      mDirty = true ;
   }
   void Load( int fileHandle )
   {
       FileReadStruct ( fileHandle, mSettings );
      mDirty = false ;
   }
   void Save( int fileHandle )
   {
       FileWriteStruct ( fileHandle, mSettings );
      mDirty = false ;
   }
};

class CStrategy_XXX : public CStrategy
{
public :
   CStrategy_XXX(){}
   CStrategy_XXX( SSettingsForOrder& set ) : CStrategy( set ){}
   
   virtual void NextStepStrategy();
};

class CStrategy_YYY : public CStrategy
{
public :
   CStrategy_YYY(){}
   CStrategy_YYY( SSettingsForOrder& set ) : CStrategy( set ){}
   
   virtual void NextStepStrategy();
};

class CStrategy_ZZZ : public CStrategy
{
public :
   CStrategy_ZZZ(){}
   CStrategy_ZZZ( SSettingsForOrder& set ) : CStrategy( set ){}
   
   virtual void NextStepStrategy();
};

CStrategy* Strategies[ 3 ];

void OnInit ()
{
   Strategies[ 0 ] = new CStrategy_XXX();
   Strategies[ 1 ] = new CStrategy_YYY();
   Strategies[ 2 ] = new CStrategy_ZZZ();
   
    int fileHandle = FileOpen ( ... );
    for ( int i = 0 ; i < 3 ; i++ )
   {
      Strategies[i].Load( fileHandle );
   }
    FileClose ( fileHandle );
}

void TestAndSave()
{
   bool saveRequired = false ;
   for ( int i = 0 ; i < 3 ; i++ )
   {
       if ( Strategies[i].IsDirty() )
      {
         saveRequired = true ;
         break ;
      }
   }
   if ( saveRequired )
   {
       int fileHandle = FileOpen ( ... );
       for ( int i = 0 ; i < 3 ; i++ )
      {
         Strategies[i].Save( fileHandle );
      }
       FileClose ( fileHandle );
   }
}

void OnDeinit ()
{
   TestAndSave();
   
   for ( int i = 0 ; i < 3 ; i++ )
   {
       delete Strategies[i];
   }
}

왜 인터페이스가 필요한지 코드에서 명확하지 않아 생략했습니다.

물론 나는 당신의 작업을 완전히 알지 못하지만 99.99 %의 확률로 필요하지 않습니다.

 
Igor Makanu :

절차적 스타일에서 다시 배우나요? 흠, 절차적 스타일로 잘 작성된 코드는 클래스에 래핑될 수 있습니다. 프로젝트를 확장해야 하는 경우 일반적으로 문제가 없습니다.

나는 많은 것을 빨리 할 수 있다

나는 이것을 이론 연구에 바치기로 결정했습니다. 오히려 MQL을 최근 몇 년 동안 등장한 것으로 가져오기 위해 여기에서도 많은 사람들이 터미널의 기능을 인식하지 못합니다.

그리고 당신이 자료를 연구한다면, 당신은 그것을 올바르게 연구해야 합니다. IMHO, 그리고 MQL이 C++ 또는 여전히 C#에 더 가까운 것을 이해해야 합니다. 수식어를 사용하지 않거나 오히려 스튜디오가 의심스러운 것으로 표시하고 최대값이 정확함)))

mql 자체는 C++를 기반으로 하지만 제작자의 노력으로 샤프에서 좋은 점은 추가하지 않고 나쁜 점을 많이 가져왔습니다. Sharpe와 유사한 표준 라이브러리 가 표시됩니다. std처럼 보이면 더 논리적으로 보일 것입니다. 임호.
 
Koldun Zloy :

다음은 예입니다.

왜 인터페이스가 필요한지 코드에서 명확하지 않아 폐기했습니다.

물론 나는 당신의 작업을 완전히 알지 못하지만 99.99 %의 확률로 필요하지 않습니다.

제 생각에는 인터페이스를 버리고 귀찮게하지 마십시오))))

OOP 디자인 패턴 "Strategy" 를 기본으로 삼았습니다.

표시된 대로 인터페이스를 기본 클래스 CStrategy를 상속하는 추상화로 적용 - 내 CStrategy에는 공용 메서드가 없으며 모든 공용은 인터페이스로 설명됩니다(3개 = 전략 자체, 전략 완료 및 이제 전략 상태에 대한 기록을 추가했습니다). 인터페이스의 역할은... 음, const 수정자의 역할과 거의 같습니다. 메서드를 설명하지 않았거나 상속으로 닫으려고 하면 초기 단계에서 경고가 표시됩니다. 지금까지는 더 많은 편의를 경험하고 있습니다. 문제보다.

일반적으로 100 %의 확률로 필요하지 않다는 것을 확인합니다 ... 그러나 CStrategy 클래스에 공개 섹션이 포함되지 않는 것이 편리합니다

귀하의 코드는 좋아 보입니다. 점심 식사 후에 집에서 재현해 보겠습니다. 제 코드와 비교해 보겠습니다.

고맙습니다!

 
Vladimir Simakov :
mql 자체는 C++를 기반으로 하지만 제작자의 노력으로 샤프에서 좋은 점은 추가하지 않고 나쁜 점을 많이 가져왔습니다. Sharpe와 유사한 표준 라이브러리 가 표시됩니다. std처럼 보이면 더 논리적으로 보일 것입니다. 임호.

아마도 MQL 포럼에서 "이것은 C ++가 아닙니다. 이것은 MQL입니다 ..."라는 문구를 시작한 사람일 것입니다. 이제 이 컨텍스트에서 귀하와 같은 많은 질문에 답합니다.

일반적으로 언어는 상당히 민주적이며 MQL로 작성하는 것이 편리하지 않습니다. "2번의 클릭으로" .dll C++로 이동하고 연초부터 .dll C#으로 이동할 수 있습니다. 메모리가 제공되는 경우 첫 번째 중 하나 개발자 Renat의 dll 관련 기사 - t .e. 이 가능성은 초기에 제품의 개념이 제안됨에 따라 IMHO

추신: 위의 내용에 대해 어떤 이유에서인지 – 나는 예술가입니다 – 나는 그렇게 봅니다! )))

 
Igor Makanu :


추신: 위의 내용에 대해 어떤 이유에서인지 – 나는 예술가입니다 – 나는 그렇게 봅니다! )))

이것은 개발자의 답변에서 매우 자주 기억되며 좋거나 나쁘며 알려져 있지 않습니다.

개발자가 정보를 제공하고 모든 질문에 대해 한 번만 닫았다면 - 기능을 추가하거나 변경할 수 없는 이유

 
Fast235 :

이것은 개발자의 답변에서 매우 자주 기억되며 좋거나 나쁘며 알려져 있지 않습니다.

개발자가 정보를 제공하고 모든 질문에 대해 한 번만 닫았다면 - 기능을 추가하거나 변경할 수 없는 이유

글쎄, 이것은 IT 독점 기업의 지원과 함께 사용자 커뮤니케이션의 확립 된 기업 스타일이며, 인터넷은 사용자가 명백한 Microsoft 버그를 발견하고 Microsoft에 연락 한 후 응답을받는 경우로 가득합니다 ... 일반적으로 침묵)))

추신: 최근 읽기에서 Habr " Windows가 메뉴를 열기 위해 파일 하나를 수십만 번 읽는 이유는 무엇입니까? "

Почему для открытия меню Windows читает один файл сто тысяч раз?
Почему для открытия меню Windows читает один файл сто тысяч раз?
  • habr.com
«Проводник тратит 700 мс на то, чтобы открыть контекстное меню панели задач. 75% этого времени он выполняет 114 801 операцию считывания из одного файла, средний объём считываемых данных 68 байт. Мне стоит написать пост об этом, или достаточно саркастичного твита?» За компьютером я работаю быстро, и поэтому меня раздражает, когда приходится...