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

 
Igor Makanu :

우리는 몇 톤에 대해 이야기하고 있습니까? 간과 된 모든 것, 모든 것이 터미널에 의해보고 될 것입니다. 삭제 장소도 알려져 있습니다. - OnDeint() .... 대화가 진공 상태의 구형 말에 대한 토론으로 축소 되었습니까? )))

아니요. 말이 있어야 할 곳으로 말을 타게 하십시오.

그리고 우리는 이전에 알려지지 않은 물체의 생성에 대해 이야기하고 있습니다. 그리고 속성에 대해서만 알려진 것이 아니라 한 번에 생성되는 개체의 수에 대해서도 알 수 없습니다.

하나는 물론 포인터를 만들고 이 포인터를 사용하여 이 객체로 작업할 수 있습니다. 그러나 얼마나 많은 포인터가 필요할지 미리 알지 못한다면 어떤 말이 있습니까? 어떤 진공? 여기에서 가장 간단하고 한 번에 사용할 수 있는 목록에서 포인터를 저장합니다. 목록에서 가져옵니다. 음, 각 개체는 포인터가 가리키는 개체의 종류를 결정할 수 있는 고유한 식별자(Type() 메서드)를 가질 수 있습니다. 생성할 때 개체의 정확한 식별을 구성하는 것이 가능합니다(유형 외에도 개체에 동일한 유형의 동일한 개체와 구별하는 다른 속성이 부여될 수 있음).

일반적으로 - 요청에 따라 정보를 저장하고 제공할 수 있을 뿐만 아니라 "살고 개발"할 수 있는 객체의 분류, 저장 목록 및 객체 작업 방법이 필요한 보다 복잡한 구조에 대해 이야기하고 있다는 느낌 프로그램과 상호 작용하고 때때로 자신을 변경하고 자신의 행동에 대해 보고합니다.

아마도 나는 정글에 올라 갔고 초기화 중에 두 필드를 변경해야하고 인생 동안 어떤 식 으로든 변경되어서는 안되는 객체에 대해 논의해야합니까? 그리고 입력 변수가 있다면 왜 객체입니까?

 
객체를 직접 만든 사람을 제외하고 아무도 객체를 삭제할 의무가 없습니다. 어떤 경우에는 이런 일이 발생하더라도 신뢰해서는 안됩니다. 내가 만든 - 내가 삭제했습니다.
 
Dmitry Fedoseev :
객체를 직접 만든 사람을 제외하고 아무도 객체를 삭제할 의무가 없습니다. 어떤 경우에는 이런 일이 발생하더라도 신뢰해서는 안됩니다. 내가 만든 - 내가 삭제했습니다.

맞아요. 그러나 지금 우리는 다른 것에 대해 이야기하고 있습니다. 그렇지 않습니까?

우리는 객체가 확실히 손실되지 않는 방법에 대해 이야기하고 있으며 확실히 찾을 수 있습니다.

개체를 만들었습니다. 나중에 삭제할 수 있도록 친절하게 알고 잃어버리지 마십시오. 개체에 대한 포인터 손실로 인한 메모리 누수가 없었습니다(포인터가 있는 예제에서 메모리 누수로 시작했습니다. 함수에 전달된 객체는 함수의 본문에서 새로 생성된 객체에 재할당되었습니다.

그리고 모든 사람은 자신의 선호도를 가지고 있습니다. 누군가는 한 가지를 좋아하고 다른 사람은 좋아합니다. 그러나 우리의 각 개체에 대해 알기 위해서는 - 적어도 그 중 2개가 있어야 하고, 적어도 2,002개가 있어야 합니다. 우리는 - 음 .., 나중에 그것들을 삭제해야 합니다. 그러나 우리 스스로가 그것들을 삭제로 삭제할 것인지, 아니면 Clear()로 리스트를 삭제하도록 할 것인지, 리스트에 대한 루프에서 삭제하도록 할 것인지, 아니면 다른 방법으로든 - 이것은 같은 질문이 아닙니다.

 
Artyom Trishkin :

일반적으로 - 요청에 따라 정보를 저장하고 제공할 수 있을 뿐만 아니라 "살고 개발"할 수 있는 객체의 분류, 저장을 위한 목록 및 객체 작업 방법이 필요한 보다 복잡한 구조에 대해 이야기하고 있다는 느낌 프로그램과 상호 작용하고 때때로 자신을 변경하고 자신의 행동에 대해 보고합니다.

아마도 나는 정글에 올라 갔고 초기화 중에 두 필드를 변경해야하고 인생 동안 어떤 식 으로든 변경되어서는 안되는 객체에 대해 논의해야합니까? 그리고 입력 변수가 있다면 왜 객체입니까?

OOP의 이상한 개념, OOP는 무엇보다도 편리합니다. 한 번 작성한 다음 개체의 새 인스턴스를 만듭니다.

토론의 시작 부분으로 돌아가서 여기에 내 예가 있습니다. 나는 종종 그것을 사용합니다 https://www.mql5.com/en/forum/160683/page861#comment_11840254

이제 거래를 한 시간 간격으로 제한하고 다음 시간에는 2.. 4로 제한해야 합니다.

내 2 클릭 예제가 이 작업에 대해 수정되었습니다.

 int OnInit ()
{
   Work1= new CWorkTime(StartHour1,StartMinute1,StopHour1,StopMinute1);
   Work2= new CWorkTime(StartHour2,StartMinute2,StopHour2,StopMinute2);
   Work3= new CWorkTime(StartHour3,StartMinute3,StopHour3,StopMinute3);
   Work4= new CWorkTime(StartHour4,StartMinute4,StopHour4,StopMinute4);
}


잘 모르겠지만 범주에서 OOP는 클래스의 모든 것을 래핑하는 것뿐이며 여기에는 기적이 있습니다. 내 슈퍼 클래스는 이것과 저것을 할 수 있습니다 ... 그리고 클래스가 10줄이면, 그렇다면 여기에 OOP가 필요하지 않습니다. 왜 자신을 제한하고 모두를 오도합니까?

나에게 편리한 곳에서는 OOP를 사용합니다. 토론은 확실히 종교로 진행되었습니다. OOP를 금지하거나 사용하기 위해))))

 
Igor Makanu :

OOP의 이상한 개념, OOP는 무엇보다도 편리합니다. 한 번 작성한 다음 개체의 새 인스턴스를 만듭니다.

토론의 시작 부분으로 돌아가서 여기에 내 예가 있습니다. 나는 종종 그것을 사용합니다 https://www.mql5.com/en/forum/160683/page861#comment_11840254

이제 거래를 한 시간 간격으로 제한하고 다음에는 2.. 4로 제한해야 합니다.

내 2 클릭 예제가 이 작업에 대해 수정되었습니다.


잘 모르겠지만 카테고리에서 OOP는 클래스의 모든 것을 래핑하는 것뿐이며 여기에는 기적이 있습니다. 내 슈퍼 클래스는 이것과 저것을 할 수 있습니다 ... 그리고 클래스가 10 라인이라면, 그렇다면 여기에 OOP가 필요하지 않습니다. 왜 자신을 제한하고 모두를 오도합니까?

나에게 편리한 곳에서는 OOP를 사용합니다. 토론은 확실히 종교로 진행되었습니다. OOP를 금지하거나 사용하기 위해))))

확실히 - 나 자신이 적극적으로 OOP를 사용하기 때문에 나는 당신을 이 종교로 데려가지 않을 것입니다.

예를 들어, 더 많은 간격이 필요한 경우 어떻게 합니까? 새 WorkNNN을 만드시겠습니까? 무엇 때문에? 프로그램 코드를 방해하지 않고 하나의 목록으로 얻을 수 있다면.

서로 다른 얘기를 하는 것 같습니다. 저는 사용편의성 얘기를 하고 있는데...편리성도 그렇고... 보여주시는 코드가 편하지가 않네요. 물론 과장된 것일 수도 있고 나는 그것에 대해 이해하지 못했습니다 ...

 
Artyom Trishkin :

예를 들어, 더 많은 간격이 필요한 경우 어떻게 합니까? 새 WorkNNN을 만드시겠습니까? 무엇 때문에? 프로그램 코드를 방해하지 않고 하나의 목록으로 해결할 수 있다면 ...

클래스 인스턴스의 목록이나 배열을 사용해야 합니다. 중요하지 않지만 그러한 예의 경우 배열을 사용하는 것이 더 쉽고 한 사이클만 수행하면 됩니다.

 bool DisableTrade= false ;
   for ( int i= 0 ;i< ArraySize (Work);i++)
     {
       if (Work[i].Disable()) {DisableTrade= true ; break }
     }
   if (DisableTrade)
     {
       Comment ( "Не торговое время!!! Сопровождение открытых ордеров" );
     }
   else ...

Artyom Trishkin :

서로 다른 얘기를 하는 것 같습니다. 저는 사용편의성 얘기를 하고 있는데...편리성도 그렇고... 보여주시는 코드가 편하지가 않네요. 물론 과장된 것일 수도 있고 나는 그것에 대해 이해하지 못했습니다 ...

불행히도 보편적 인 코드를 작성하는 것은 불가능합니다. 작성되면 추가 수정이 힘든 과정이 될 것이며 결과적으로 보편적 인 코드는 더 많은 리소스를 필요로 할 것입니다. 일반적으로 우리는 이것에 대해 영원히 이야기 할 수 있습니다 , 내가 이미 썼을 때 잘 알려진 프로그래머 중 한 명이 말했듯이 - "코드는 작업을 수행해야 합니다! - 그것으로 충분합니다" , 그리고 다른 모든 것은 ... 글쎄, 이것은 더 깊이 파고 싶은 욕망입니다. 창조하다! )))

 
Artyom Trishkin :

///

예를 들어, 더 많은 간격이 필요한 경우 어떻게 합니까? 새 WorkNNN을 만드시겠습니까? 무엇 때문에? 프로그램 코드를 방해하지 않고 하나의 목록으로 얻을 수 있다면.

///

그러면 속성 창에 숫자 간격 매개변수가 없습니다. 최적화는 불가능합니다. 옵션이 아닙니다.

각 간격에 대해 새 개체를 만드는 것도 최선의 선택은 아닙니다. 그럼에도 불구하고 브레이크를 증가시킵니다. 클래스를 만들려면 해당 클래스의 간격 매개변수가 배열에 추가됩니다. 더 빨라질 것입니다.

 
Dmitry Fedoseev : rmoza. 클래스를 만들려면 해당 클래스의 간격 매개변수가 배열에 추가됩니다. 더 빨라질 것입니다.

하나의 클래스를 만들거나 여러 매개변수를 추가()하는 함수, 개별 매개변수를 사용하여 여러 클래스를 만드는 것과는 전혀 차이가 없습니다.

추신: 긴 "코드 발판" 형태로 하나의 큰 기능을 작성하는 경우 프로세서 캐시가 항상 효율적으로 사용되는 것은 아니지만 전환을 예측할 때 이러한 "발판"에서 승리할 수 있음을 잊지 마십시오. .... 이것은 테스트 만 표시 할 수 있지만 특정 PC 및 특정 컴파일러에서 ...

 
Dmitry Fedoseev :

그러면 속성 창에 숫자 간격 매개변수가 없습니다. 최적화는 불가능합니다. 옵션이 아닙니다.

각 간격에 대해 새 개체를 만드는 것도 최선의 선택은 아닙니다. 그럼에도 불구하고 브레이크를 증가시킵니다. 클래스를 만들려면 해당 클래스의 간격 매개변수가 배열에 추가됩니다. 더 빨라질 것입니다.

동의한다. 그리고 다시, 그것은 모두 체크아웃 필드를 설정하는 방법으로 귀결됩니다. 그리고 입력 매개변수에서 모든 간격을 저장하는 객체로 전송하는 방법은 기술의 문제입니다. 간격 목록의 모든 개체를 다시 생성하고 그 중 하나만 변경할 때 가능하지만 코드를 작성할 때 데이터를 변경하는 문제와 "성가심/불편함"의 문제입니다.

 
Roman :

new 연산자를 통해 동적 객체 생성의 의미를 설명해주세요.

자동으로 객체를 생성할 때 클래스 객체는 스택에 생성되는데 , 실행 시간 면에서 동적 객체보다 빠릅니다.
객체를 동적으로 생성할 때 클래스 객체는 메모리(힙)에 생성되지만 OS 메모리 관리자를 사용하는 동안 프로세스가 더 느립니다.

질문은 다음과 같습니다.
자동 생성이 더 빠른 경우 동적 개체를 사용하는 것이 더 나은 이유는 무엇입니까?
명시적으로 메모리 할당을 제어합니까?
스택 오버플로 가능성을 배제하시겠습니까?
그리고 갑자기 물건을 잃지 않습니까?
스택이 오버플로되면 개체가 자동으로 삭제됩니까?

안녕하세요. 컴퓨터 메모리는 스택 컨텍스트에서 사용하든 힙 컨텍스트에서 사용하든 동일한 성능을 갖습니다. 동적 메모리 자체의 관리는 가비지 수집기의 구현에 따라 다릅니다. 예를 들어 Python(저속 버전)과 같은 참조 카운팅 또는 백그라운드 프로세스(Net CLR)에서 실행 그래프를 우회하여 객체 생성 에포크 분석이 될 수 있습니다. MQL에서 어떤 변형이 사용되는지는 알려져 있지 않지만, 우리는 그것의 극도의 효율성을 가정할 수 있습니다. MQL5 사용자는 삭제 연산자에 직접 액세스할 수 있으므로 GC 자체의 작업이 크게 간소화됩니다. 이와 관련하여 new를 사용할 때 오버헤드에 대한 우려는 헛된 것입니다. 동적 메모리를 자유롭게 사용하십시오.

"스택 오버플로"는 복잡한 재귀를 사용하거나 재귀 알고리즘에 오류가 있는 경우에만 현대 시스템에서 이 경우를 충족할 수 있습니다. 최신 프로그램은 동적 페이지 로딩과 함께 가상 주소 공간에서 항상 보호된 OC 모드로 실행되므로 걱정하지 마십시오. 스택이 끝나지 않습니다. :)

사유: