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

 
Dmitry Fedoseev :

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

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

아직 MQL5에서 C# DLL을 사용해 보지 못했습니다. C #에서 클래스의 인스턴스를 만든 장점에서 C ++의 래퍼로 작업을 수행했습니다. 이제 DLL에서 정적 클래스가 사용되어 가능성이 크게 제한된다는 의혹이 있습니다. 이제 클래스가 정적인지 동적인지 아는 사람이 있습니까?

 
Alexey Volchanskiy :

아직 MQL5에서 C# DLL을 사용해 보지 못했습니다. C #에서 클래스의 인스턴스를 만든 장점에서 C ++의 래퍼로 작업을 수행했습니다. 이제 DLL에서 정적 클래스가 사용되어 가능성이 크게 제한된다는 의혹이 있습니다. 이제 클래스가 정적인지 동적인지 아는 사람이 있습니까?

나는 MQL5에 대해 정적 속성만 사용 했습니다. 정적 수정자가 있는 경우 서명은 ME에서 직접 볼 수 있어 매우 편리합니다.

제한 사항에 대해 음, 옵션으로 작업을 별도의 스레드에 던진 다음 종료합니다. C #에서는 매우 빠르게 완료됩니다.

또는 dll 내부에서 호출을 작성할 수 있습니다.

나는 그것이 문제라고 생각하지 않는다


상향:

MQL 작업에서 OOP를 사용하는 합리성에 대한 나의 최근 연구를 설명할 수 있을지 의심스럽습니다.

일반적으로 OOP 스타일을 사용하는 경우 완전히 액세스 제어를 사용하고 의식적으로 모든 private/protected/public 한정자를 설정하고 각 메서드와 서명을 설명할 때 const를 사용해야 합니다. 데이터), 그리고 get/set을 통해 보호된 데이터에 대한 모든 액세스 쓰기 - OOP를 올바르게 사용 하면 개발 단계 에서 의도하지 않은 데이터 수정 으로 인한 복잡한 버그를 식별할 수 있습니다.

나는 이런 식으로 하나의 클래스를 처음부터 다시 작성했습니다. 컴파일러는 즉시 내 작업과의 불일치를 발견하고 아이디어를 확인(테스트)할 때 자식에서 기본 클래스로 올라갔습니다. 테스트 중에 이 버그를 발견할 수 있었다는 것은 사실이 아닙니다. 그렇게 생각하고 싶을 수도 있습니다.)).

저에게 또 다른 눈에 띄는 장점은 전역적으로 설명된 변수를 모두 남겨 두었다는 것입니다. 사용하지 않으려고 합니다. 여기에서는 전혀 사용되지 않습니다(글, 전역 플래그 최적화를 제외하고-내 작업 및 심각한 오류 플래그에 대해) 거래시)

흥미로운 관찰은 내가 get / set 을 통해 모든 호출을 다시 작성했을 때 클래스 소스가 먼저 볼륨이 증가한 다음 get / set 호출로 대체되기 시작했을 때 크게 줄어들기 시작했다는 것입니다. 이것이 코드의 볼륨을 크게 부풀린다고 말하지는 않겠지만 다시 한 번 - 이것은 데이터의 무결성을 제어할 수 있게 해줍니다!


추신: 글쎄요, 당신이 완벽주의자이고 get/set를 통한 추가 호출이 추가 프로세서 사이클이라고 생각한다면 작업이 100% 완료되면 각 get/set의 호출을 계산하는 것이 어렵지 않습니다. 소스 코드에서 검색을 통해 설정하고 이전 규칙을 적용합니다. 코드 섹션을 두 번 이상 호출하면 이 코드 섹션을 서브루틴으로 정렬해야 합니다. ---> get/set 호출이 필드의 할당/읽기로 확장되면 .... 그러나 이것은 모호한 이점이 있는 "더러운 속임수"를 말하는 것입니다.

 
Igor Makanu :

나는 MQL5에 대해 정적 속성만 사용 했습니다. 정적 수정자가 있는 경우 서명은 ME에서 직접 볼 수 있어 매우 편리합니다.

제한 사항에 대해 음, 옵션으로 작업을 별도의 스레드에 던진 다음 종료합니다. C #에서는 매우 빠르게 완료됩니다.

또는 dll 내부에서 호출을 작성할 수 있습니다.

나는 그것이 문제라고 생각하지 않는다

샤프의 경우 정적 멤버를 의미하지 않았지만 이것은

 public static class ClassName {}

정적 클래스의 인스턴스는 new를 통해 생성할 수 없고 삭제를 통해 소멸되며 생성자와 소멸자가 없으며 모든 멤버와 메서드는 정적일 뿐입니다. 한마디로 일을 안한지 오래인데 프로크루스테스식 침대처럼 불편함이 많았던걸로 기억합니다.

일반적으로 수학과 같은 라이브러리 기능의 컨테이너로 사용됩니다.

 
Alexey Volchanskiy :

샤프의 경우 정적 멤버를 의미하지 않았지만 이것은

나는 MQL이 정적 수식어 없이 그것을 보지 못할 것이라고 생각한다. 이것은 클래스이지만 , 정적 수식어 가 있는 내부의 메소드들은 볼 것이다

dll 내부에서 로컬로 클래스를 사용하고 원하는 대로 클래스를 사용합니다. 정적 없이 dll에서 WinForm 클래스를 만들었습니다. 모든 것이 잘 작동하지만 정적을 통해 선언된 함수를 호출했으며 이러한 함수가 어느 클래스 내부에서 선언되었는지는 중요하지 않습니다. 전체 클래스가 적어도 전부는 아니지만 정적이지만 MQL에서 dll을 호출하려면 전혀

아직 확인이 안되네요 SSD로 교체 후 노트북에 스튜디오를 설치하지 않고 필요할 때까지

 
Alexey Volchanskiy :

아직 MQL5에서 C# DLL을 사용해 보지 못했습니다. C #에서 클래스의 인스턴스를 만든 장점에서 C ++의 래퍼로 작업을 수행했습니다. 이제 DLL에서 정적 클래스가 사용되어 가능성이 크게 제한된다는 의혹이 있습니다. 이제 클래스가 정적인지 동적인지 아는 사람이 있습니까?

클래스는 정상이고 메서드는 정적입니다. 다른 옵션을 시도하지 않았습니다.

 
이고르, 드미트리, 간단히 말해서 직접 시도해야합니다. 내가 알기로는 어떤 경우 에도 클래스 객체의 이름이 아니라 클래스 이름을 참조해야 합니다. 노력하겠습니다.
 
안녕하세요! 신호에 대해 질문이 있는 경우 어디에 작성해야 합니까? 보증금이 $312인 경우 신호를 구독하는 것이 합리적인지 알고 싶습니다. 그리고 한 달 반 전에 거래를 시작했다면 어떻게 브로커에게 전혀 의존하지 않고 효율적으로 일할 수 있습니까? 고맙습니다.
 
Alexey Volchanskiy :
이고르, 드미트리, 간단히 말해서 직접 시도해야합니다. 내가 알기로는 어떤 경우 에도 클래스 객체의 이름이 아니라 클래스 이름을 참조해야 합니다. 노력하겠습니다.

클래스 이름별 주소.

 
Alexey Volchanskiy : Igor, Dmitry, 간단히 말해서 직접 시도해야 합니다. 내가 알기로는 어떤 경우 에도 클래스 객체의 이름이 아니라 클래스 이름을 참조해야 합니다. 노력하겠습니다.

이것이 MQL5에서 C#을 호출하는 유일한 방법이라고 말할 수는 없으며 개발자 https://www.mql5.com/ru/forum/285631 의 예를 사용했습니다.

 #import "TestLib.dll"

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int x= 41 ;
   TestClass::Inc(x);
   Print (x);
  }

public class TestClass
{
   public static void Inc(ref int x)
   {
    x++;
   }
}

C#에서 진입점을 얻기 위해 다른 방법을 사용하지 않았습니다. 탬버린과 함께 특정 춤을 추며 MT4용으로 동일한 .dll 코드를 컴파일할 수 있습니다.

기사 및 내 연구 기사의 코드가 의도한 대로 작동하지 않는 이유 https://www.mql5.com/ru/forum/3153/page4#comment_10366498 - 모든 것이 지금까지 작동합니다.

 

OOP 스타일 코드로 내 전투의 결과를 검토했습니다 - 흠... 훌륭합니다! ))))


질문이 나타났지만 내 코드에서는 세 번 양식 구성이 정확히 사용되었습니다.

 private :
   COrder            *m_order;
.......

// использую так
return ( CheckPointer (m_order)== POINTER_INVALID ? true : m_order.Orderclose());

//или так

if ( CheckPointer (m_order)== POINTER_INVALID )

호출은 모두 privat 방식이지만 "제다이 트릭"이 있습니까? CheckPointer (m_order)==POINTER_INVALID에서 소스 텍스트를 이스케이프하려면

get/set에 대해 묻고 있습니다.

특별한 문제는 없지만 C ++의 OOP 기술에 대한 지식에 대한 갈증이나 변덕이 아직 가라 앉지 않았습니다.