마운드에서 OOP에 대해 이야기하기 - 페이지 5

 
Alexey Volchanskiy :

나는 모든 것을 읽었습니다. 모든 사람이 다른 관심을 가지고 있는 것입니다... 지금 가상 그리드를 설정하고 관리하기 위한 수업을 다시 하고 있습니다. 필요합니다.

그리고 여기에서 저는 복사 생성자와 할당 연산자를 2일 동안 만지작거리고 있었습니다. 포인터 형태의 데이터 멤버가 있는 복잡한 클래스가 있습니다.

 
Dennis Kirichenko :

그리고 여기에서 저는 복사 생성자와 할당 연산자를 2일 동안 만지작거리고 있었습니다. 포인터 형태의 데이터 멤버가 있는 복잡한 클래스가 있습니다.

너무 초보적인 글을 쓰는듯...

 
Dennis Kirichenko :

함수 포인터를 사용할 수 있습니다.

가상 기능에서도 그렇게 됩니까?

예, 그리고 함수에 대한 포인터 - 저는 항상 내부 거부를 일으켰습니다. 이제 나는 "순수한 C"에서 작업할 때 함수 포인터가 사용된 이유를 기억하지 못합니다. 그러나 C++로 전환할 때 어떤 이유로 버려야 했습니다. 그리고 그 이후로 나는 그것들을 사용하지 않았습니다. 포인터 - 객체에 있어야 합니다.

그러나 나는 내가 "모든 100가지에 대해 옳다"고 주장하지 않을 것입니다. 나는 내가 올드 스쿨 구식 방귀 경험이 많다는 데 동의합니다.

 
fxsaber :

너무 초보적인 글을 쓰는듯...

부끄러워 하지마.

정의의 거장 사용으로 - 제 생각에는 도대체 누가 비교할 수 있습니까?

 
George Merts :


... 내 기능은 다음과 같습니다.

 int CFactoryBalanceResultSeries::Compare( const CObject *poNode, const int iMode) const
{
   CFactoryBalanceResultSeries* pfdsAnother = CONVERT_OBJECT_WITH_CHECK(poNode,CFactoryBalanceResultSeries,MOT_FACTORYBALANCERES_SERIES);
   
   switch (iMode)
      {
       case FSM_BY_PART_OF_MAX_DD_A:     return (_CompareByPartOfMaxDDWith(pfdsAnother, true ));
       case FSM_BY_PART_OF_MAX_DD_D:     return (_CompareByPartOfMaxDDWith(pfdsAnother, false ));

       case FSM_BY_PART_OF_MAX_SLQUEUE_A: return (_CompareByPartOfMaxSLQueueWith(pfdsAnother, true ));
       case FSM_BY_PART_OF_MAX_SLQUEUE_D: return (_CompareByPartOfMaxSLQueueWith(pfdsAnother, false ));

       case FSM_BY_LAST_PRCDATA_A:       return (_CompareByLastPrcdataWith(pfdsAnother, true ));
       case FSM_BY_LAST_PRCDATA_D:       return (_CompareByLastPrcdataWith(pfdsAnother, false ));
       case FSM_BY_LAST_MNYDATA_A:       return (_CompareByLastMnydataWith(pfdsAnother, true ));
       case FSM_BY_LAST_MNYDATA_D:       return (_CompareByLastMnydataWith(pfdsAnother, false ));
       case FSM_BY_LAST_MNYLOTDATA_A:   return (_CompareByLastMnylotdataWith(pfdsAnother, true ));
       case FSM_BY_LAST_MNYLOTDATA_D:   return (_CompareByLastMnylotdataWith(pfdsAnother, false ));
      
       case FSM_BY_PRCYEARRECOVERY_A:   return (_CompareByYearPrcrecoveryWith(pfdsAnother, true ));
       case FSM_BY_PRCYEARRECOVERY_D:   return (_CompareByYearPrcrecoveryWith(pfdsAnother, false ));
       case FSM_BY_MNYYEARRECOVERY_A:   return (_CompareByMnyYearRecoveryWith(pfdsAnother, true ));
       case FSM_BY_MNYYEARRECOVERY_D:   return (_CompareByMnyYearRecoveryWith(pfdsAnother, false ));
       case FSM_BY_MNYLOTYEARRECOVERY_A: return (_CompareByMnylotYearRecoveryWith(pfdsAnother, true ));
       case FSM_BY_MNYLOTYEARRECOVERY_D: return (_CompareByMnylotYearRecoveryWith(pfdsAnother, false ));
      
       case FSM_BY_PRCVAR_A:             return (_CompareByPrcVarWith(pfdsAnother, true ));
       case FSM_BY_PRCVAR_D:             return (_CompareByPrcVarWith(pfdsAnother, false ));
       case FSM_BY_MNYVAR_A:             return (_CompareByMnyVarWith(pfdsAnother, true ));
       case FSM_BY_MNYVAR_D:             return (_CompareByMnyVarWith(pfdsAnother, false ));
       case FSM_BY_MNYLOTVAR_A:         return (_CompareByMnylotVarWith(pfdsAnother, true ));
       case FSM_BY_MNYLOTVAR_D:         return (_CompareByMnylotVarWith(pfdsAnother, false ));
      
       case FSM_BY_PRC_GRAILRATIO_A:     return (_CompareByPrcGrailratioWith(pfdsAnother, true ));
       case FSM_BY_PRC_GRAILRATIO_D:     return (_CompareByPrcGrailratioWith(pfdsAnother, false ));

       case FSM_BY_MAGIC_A:             return (_CompareByMagicWith(pfdsAnother, true ));
       case FSM_BY_MAIGC_D:             return (_CompareByMagicWith(pfdsAnother, false ));
       default :
         break ;
      };
         
   return ( NULL );
};

George, 여기에는 표시되지 않습니다. 예를 들어 _CompareByPrcVarWith() 함수는 클래스 메서드 또는 일반 함수입니다. C++에는 클래스 메서드에 대한 포인터가 있습니다. 고유한 특성이 있습니다. 솔직히 말해서 MQL5에서 이러한 포인터를 사용해 본 적이 없습니다.

하지만 아직 코드의 구조를 개선할 여유가 있다고 생각합니다.

결국, 기능이란 무엇입니까?

기능 ( 위도.   기능 - " 성능, 수수료; 의무의 부름 ") - 하나의 변경이 다른 하나의 변경을 수반하는 요소 간의 관계.

저것들. 함수가 뭔가를 합니다. 단조로운 동작이 하나의 기능의 본문에 결합되는 것이 바람직합니다.

귀하의 예에서 기능이

_CompareByPartOfMaxDDWith(),

_CompareByPartOfMaxSLQueueWith(),

_CompareByLastPrcdataWith(),

_CompareByLastMnydataWith() 등

COMPARISON에 참여하고 제공합니다   이 비교의 결과. 그들은 이름이 다릅니다. IMHO, 나쁜 습관. 매개 변수를 다르게 두는 것이 좋습니다 ...

그래서. 모든 기능을 하나로 병합하거나 가상 메서드 또는 템플릿으로 만드는 것이 가치가 있다고 생각합니다. 먹지만 클래스는 부모-자식 계층 구조를 따라야 합니다.

일반적으로 복잡한 코드를 작성하는 것은 매우 쉽고 매우 어렵습니다 .

 
Dennis Kirichenko :

George, 여기에는 표시되지 않습니다. 예를 들어 _CompareByPrcVarWith() 함수는 클래스 메서드 또는 일반 함수입니다. C++에는 클래스 메서드에 대한 포인터가 있습니다. 고유한 특성이 있습니다. 솔직히 말해서 MQL5에서 이러한 포인터를 사용해 본 적이 없습니다.

이것은(그리고 밑줄로 시작하는 모든 것) 보호된 클래스 기능입니다.

비교에 종사하고 산에서 나누어줍니다   이 비교의 결과. 그들은 이름이 다릅니다. IMHO, 나쁜 습관. 매개 변수를 다르게 두는 것이 좋습니다 ...

그래서. 모든 기능을 하나로 병합하거나 가상 메서드 또는 템플릿으로 만드는 것이 가치가 있다고 생각합니다. 먹지만 클래스는 부모-자식 계층 구조를 따라야 합니다.

그래서 그들은 하나로 합쳐졌습니다!

오직 하나의 함수 - Compare()가 있지만, 전달된 키로 비교할 필요가 있습니다. 따라서 특정 보호 기능 중 하나가 선택됩니다. 따라서 사용자가 액세스할 수 없도록 보호(보호)되어 있으며 밑줄이 표시되는 Compare()에서만 액세스할 수 있습니다.

이것은 또한 코드 디자인 규칙 중 하나입니다. 밑줄로 시작하는 함수는 사용자가 호출하기 위한 것이 아니라 특정 클래스 내 작업만 제공합니다. 액세스가 제한됩니다.

 
Dennis Kirichenko :

그리고 여기에서 저는 복사 생성자와 할당 연산자를 2일 동안 만지작거리고 있었습니다. 포인터 형태의 데이터 멤버가 있는 복잡한 클래스가 있습니다.


Denis, 저는 사람마다 접근 방식이 다르다고 말하고 싶었습니다. 일반적으로 어제 스레드를 열었을 때 "아 OOP는 매우 어렵습니다. SB는 끔찍한 블랙 박스입니다." 그들은 예상대로 나타나지 않았습니다.

그러나 사람들은 잘랐고 모든 사람은 자신의 접근 방식을 가지고 있습니다. 이것은 Renat이 많이 이야기하는 공통 프로젝트 측면에서도 흥미롭습니다.

추신: 프로젝트 공유가 작동하지 않습니다. 최근에 시도했습니다.

 
George Merts :

이것은(그리고 밑줄로 시작하는 모든 것) 보호된 클래스 기능입니다.

그래서 그들은 하나로 합쳐졌습니다!

오직 하나의 함수 - Compare()가 있지만, 전달된 키로 비교할 필요가 있습니다. 따라서 특정 보호 기능 중 하나가 선택됩니다. 따라서 사용자가 액세스할 수 없도록 보호(보호)되어 있으며 밑줄이 표시되는 Compare()에서만 액세스할 수 있습니다.

이것은 또한 코드 디자인 규칙 중 하나입니다. 밑줄로 시작하는 함수는 사용자가 호출하기 위한 것이 아니라 특정 클래스 내 작업만 제공합니다. 액세스가 제한됩니다.


_CompareXXX() 메서드가 많은 경우 어떻게 병합됩니까? 그리고 내 이해에서 1이어야합니다.

예를 들어 질문은 _CompareByPartOfMaxDDWith() 메서드가 CFactoryBalanceResultSeries::Compare()가 아닌 다른 곳에서 호출 되었습니까?

 
Dennis Kirichenko :

_CompareXXX() 메서드가 많은 경우 어떻게 병합됩니까? 그리고 내 이해에서 1이어야합니다.

예를 들어 질문은 _CompareByPartOfMaxDDWith() 메서드가 CFactoryBalanceResultSeries::Compare()가 아닌 다른 곳에서 호출 되었습니까?

_CompareXXX() 메서드가 하나만 있으면 원래 Compare() 가상 함수와 다르지 않습니다.

문제는 _CompareBy...() 메서드가 기본 Compare()에서만 호출된다는 것입니다. 이것은 시작 부분의 밑줄이 경고하는 것입니다.

일반 Compare() 메서드 - 두 개체에 대한 포인터와 비교 방법을 나타내는 키를 허용합니다. 이 일반적인 방법은 키를 파싱한 후 특정 방법을 호출하여 하나의 키만 비교하도록 설계되었습니다. 또한 이러한 각 메소드는 전달된 두 객체의 키 값을 계산하고 키가 int, double, bool 또는 string인지 여부에 따라 특정 유형을 비교하는 (또한 보호됨) 메소드가 호출됩니다.

모든 _CompareBy...() 메서드는 하나의 함수에 작성할 수 있습니다. 그러나 내 생각에는 코드의 가시성이 악화될 것입니다.

 
George Merts :

_CompareXXX() 메서드가 하나만 있으면 원래 Compare() 가상 함수와 다르지 않습니다.

문제는 _CompareBy...() 메서드가 기본 Compare()에서만 호출된다는 것입니다. 이것은 시작 부분의 밑줄이 경고하는 것입니다.

일반 Compare() 메서드 - 두 개체에 대한 포인터와 비교 방법을 나타내는 키를 허용합니다. 이 일반적인 방법은 키를 파싱한 후 특정 방법을 호출하여 하나의 키만 비교하도록 설계되었습니다. 또한 이러한 각 메소드는 전달된 두 객체의 키 값을 계산하고 키가 int, double, bool 또는 string인지 여부에 따라 특정 유형을 비교하는 (또한 보호됨) 메소드가 호출됩니다.

모든 _CompareBy...() 메서드는 하나의 함수에 작성할 수 있습니다. 그러나 내 생각에는 코드의 가시성이 악화될 것입니다.


나는 당신을 이해했다. 아마 취향의 문제일 겁니다. 그러나 나는 한 가지 방법으로 모든 것을 할 것입니다. 특히 보호 및 개인 메서드가 Compare()를 제외하고 다른 곳에서 호출되지 않는 경우.