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

 
Igor Makanu :

내 예에서 내가 :

onTick() 메서드에서 Ask,bid 값을 복사하고 다른 메서드(가상 거래)에서 _Ask, _Bid를 사용합니다.

전역 변수로 작업하는 것과 같을까요?

추신: 물론 옵션으로 모든 방법을 참조하여 &tick을 전달할 수 있지만 다시 한 번 더 효율적인 방법에 대한 질문이 있습니다.

이 주제가 여전히 관련이 있는 경우 필드 저장 옵션이 개념적으로 덜 효율적이고 덜 정확하다는 점에 유의하겠습니다. 원칙적으로 이 두 개념은 거의 항상 상관관계가 있습니다.
깨끗한 코드(부작용 없음)는 항상 컴파일러에 의해 더 잘 최적화되고 이해하기 쉽습니다.
개체가 입력을 기반으로 상태를 변경하려는 경우 해당 입력을 자체적으로 저장해서는 안 됩니다(캐싱 목적 제외).
커틀릿에서 파리를 분리해야합니다.

 

여하튼 나는 클래스에서 변수를 초기화 하는 두 가지 방법에 대해 질문했습니다. 여기 하나가 있습니다:

 class CA{
   protected :
       int val;
   public :
      CA(){
         val= 0 ;
      }      
};

그리고 이것:

 class CA{
   protected :
       int val;
   public :
      CA():val( 0 ){
      }      
};

두 번째 방법의 장점이 무엇인지 물어보니 정적 멤버를 초기화할 수 있다는 답변을 받았습니다. 그러나 정적 멤버만 이러한 방식으로 초기화되지 않습니다.

따라서 질문은 여전히 동일합니다. 모든 사람에게 근본적인 차이점이 있으며 두 번째 방법의 이점은 무엇입니까?

 

인용문

Хочется закончить свою песнь важными словами. Любые описанные механизмы, принципы и паттерны, как и ООП в целом не стоит применять там, где это бессмысленно или может навредить. Это ведет к появлению статей со странными заголовками типа «Наследование — причина преждевременного старения» или «Синглтон может приводить к онкологическим заболеваниям».

 

 
Dmitry Fedoseev :

여하튼 나는 클래스에서 변수를 초기화 하는 두 가지 방법에 대해 질문했습니다. 여기 하나가 있습니다:

https://www.mql5.com/en/forum/85652/page45#comment_15975127

드미트리 페도세프 :

두 번째 방법의 장점이 무엇인지 물어보니 정적 멤버를 초기화할 수 있다는 답변을 받았습니다. 그러나 정적 멤버만 이러한 방식으로 초기화되지 않습니다.

정적 이 아니라 상수 필드

 class CA
{
protected :
   const int          val;
   static int         static_val;
public :
                     CA(): val( 0 ) { }
};
static int CA::static_val = 12345 ;
드미트리 페도세프 :

따라서 질문은 여전히 동일합니다. 모든 사람에게 근본적인 차이점이 있으며 두 번째 방법의 이점은 무엇입니까?

"나쁜 형식으로 간주됩니다"라는 문장을 버리면 더 편리한 것은 IMHO를 사용하는 것입니다.

 
예, 정확히, 일정하고, 기만당했습니다)
 

apnu 주제 다시, 마지막 메시지는 내가 스스로 알아낸 것 같아 삭제 ....


이 코드가 있습니다:

class CSetting  
{
public :
   enum T            {T1, T2, T3, T4, T5, T6, T7, T8};
   enum D            {D1, D2, D3, D4, D5, D6, D7, D8};
   enum V            {V1, V2, V3, v4};
private :
   int                param1, param2;
   T                 t;
   D                 d;
   V                 v;
public :
                     CSetting( const int in_param1, const int in_param2, const T in_t, const D in_d, const V in_v);
  };
//+------------------------------------------------------------------+
CSetting::CSetting( const int in_param1, const int in_param2, const T in_t, const D in_d, const V in_v)
   : param1(in_param1),
     param2(in_param2),
     t(in_t),
     d(in_d),
     v(in_v)
  {}

//--- input parameters
input int               Input_p1 = 1 ;   // p1 = -1000 ... +1000
input int               Input_p2 = 2 ;   // p2 = -1000 ... +1000
input CSetting::T      Input_T = CSetting::T::T1;
input CSetting::D      Input_D = CSetting::D::D1;
input CSetting::V      Input_V = CSetting::V::V1;

이 데이터를 비트 단위로 저장할 하나의 int를 사용하여 CSetting의 privat 섹션에서 3개의 열거형과 2개의 int를 채우고 싶습니다. 코드를 스케치했습니다.

 class CSetting
  {
public :
   enum T            {T1, T2, T3, T4, T5, T6, T7, T8};
   enum D            {D1, D2, D3, D4, D5, D6, D7, D8};
   enum V            {V1, V2, V3, v4};
private :
   int                param1, param2;
   T                 t;
   D                 d;
   V                 v;
public :
                     CSetting( const uint data);
  };
//+------------------------------------------------------------------+
CSetting::CSetting( const uint data)
{
   v = (V)(data & 0x3 );
   d = (D)((data >> 2 ) & 0x7 );
   t = (T)((data >> 5 ) & 0x7 );
   uint tmp = ((data >> 8 ) & 0xFFF );
   param2 = (tmp & 0x800 ) == 0x800 ? -( int )(tmp & 0x7FF ) : ( int )(tmp & 0x7FF );
   tmp = data >> 20 ;
   param1 = (tmp & 0x800 ) == 0x800 ? -( int )(tmp & 0x7FF ) : ( int )(tmp & 0x7FF );
}
//+------------------------------------------------------------------+
//--- input parameters
input int DATA         = 0xFFFFFFFF ;

이론적으로 이것은 작동해야 합니다. enum 에 대한 데이터에서 하위 2 + 3 +3 비트를 가져오고 int의 나머지 24비트를 사용하여 상위 12번째 비트에서 숫자의 부호를 유지하면서 param1 및 param2를 채웁니다.


오류가 있는지 어떻게 확인할 수 있습니까? )))

글쎄, 또는 이 데이터를 int에 저장하는 방법에 대해 다른 사람의 옵션 에 감사드립니다.

 
다음과 같이 할 수도 있습니다. t + d * 10 + v * 100
 
Igor Makanu :

오류가 있는지 어떻게 확인할 수 있습니까? )))

글쎄, 평소와 같이 - 나는 짐을 꾸리고, 풀고, 신원을 확인했습니다. 모든 엣지 케이스를 테스트하는 것이 바람직합니다.
 
Dmitry Fedoseev :
다음과 같이 할 수도 있습니다. t + d * 10 + v * 100

작동하지 않습니다

비트 단위로 이동하거나 2로 곱하거나 나누어야 합니다. 이는 이동과 동일합니다.

더엑스퍼트 :
글쎄, 평소와 같이 - 나는 짐을 꾸리고, 풀고, 신원을 확인했습니다. 모든 엣지 케이스를 테스트하는 것이 바람직합니다.

그래서 예 ... 논리적

하지만 패킹을 할 계획은 없었습니다 - 옵티마이저를 위해 입력 변수의 수를 줄이고 GA가 빨리 수렴하지 않도록 그 위에 그레이 코드를 씁니다 - 많은 GA 패스가 필요합니다


이미 경계 사례를 확인했지만 경험상 .... 버그가 너무 교활합니다 !!! )))

추신: 물론 주기를 0 ... MAX_UINT에서 파일로 재설정하고 시각적으로 볼 수 있지만 최상의 옵션인 IMHO는 아닙니다.

 
Igor Makanu :

작동하지 않습니다

...

왜 갑자기 작동하지 않습니까? 세 개의 열거, 10보다 큰 것은 없습니다. 초등학교 2학년 산수.