OOP(객체 지향 프로그래밍)에 대한 질문 - 페이지 11

 

약간의 뉘앙스에 대해 경험 많은 프로그래머의 의견을 알고 싶습니다. 클래스에서 최소한 변수 선언 을 취하십시오. 예를 들어, 이 특정 클래스의 다양한 메소드 내부에 선언된 내 클래스의 변수가 있습니다. 각 메소드에서 가장 자주 선언됩니다. 이 작업을 수행할 가치가 있습니까 아니면 private 섹션에서 한 번 선언한 다음 사용하는 것이 더 나은가요?

내가 이해하는 것처럼 카운터 변수는 주기에 있는 경우 사용하는 것이 더 논리적입니다. 결국, 카운터는 예를 들어 루프를 사용하는 경우 계산 시 값으로 명시적으로 설정됩니다.

 for (i = OrdersTotal () - 1 ; i >= 0 ; i--)
{

}

각 방법에서 변수 i 를 선언하는 것은 합리적이지 않습니다. 이것은 분명히 메모리 셀에 대한 추가 메모리 비용입니다. 일반적으로 그러한 순간이 중요합니다.

사이클뿐만 아니라 다른 옵션에도 동일하게 적용됩니다. 결국, 두 번 이상 선언해야하지만 동일한 역할을하는 다른 변수가 충분합니다.. 유일한 것은 내가 볼 때 일부는 값을 재설정해야 "쓰레기"가 없습니다. 이전 작업에서. 그러면 이렇게 하는 것이 합당한가, 아니면 이러한 변수를 다시 선언하는 것이 더 쉬운가... 일반적으로 전문가들에게 그에 대한 이야기를 듣고 싶습니다.

 
hoz :

약간의 뉘앙스에 대해 경험 많은 프로그래머의 의견을 알고 싶습니다. 클래스에서 최소한 변수 선언을 취하십시오. 예를 들어, 이 특정 클래스의 다양한 메소드 내부에 선언된 내 클래스의 변수가 있습니다. 각 메소드에서 가장 자주 선언됩니다. 이 작업을 수행할 가치가 있습니까 아니면 private 섹션에서 한 번 선언한 다음 사용하는 것이 더 나은가요?

내가 이해하는 것처럼 카운터 변수는 주기에 있는 경우 사용하는 것이 더 논리적입니다. 결국, 카운터는 예를 들어 루프를 사용하는 경우 계산 시 값으로 명시적으로 설정됩니다.

각 방법에서 변수 i 를 선언하는 것은 합리적이지 않습니다. 이것은 분명히 메모리 셀에 대한 추가 메모리 비용입니다. 일반적으로 그러한 순간이 중요합니다.

사이클뿐만 아니라 다른 옵션에도 동일하게 적용됩니다. 결국, 두 번 이상 선언해야하지만 동일한 역할을하는 다른 변수가 충분합니다.. 유일한 것은 내가 볼 때 일부는 값을 재설정해야 "쓰레기"가 없습니다. 이전 작업에서. 그러면 이렇게 하는 것이 합당한가, 아니면 이러한 변수를 다시 선언하는 것이 더 쉬운가... 일반적으로 전문가들에게 이에 대한 이야기를 듣고 싶습니다.

이 작업을 수행할 가치가 있는지 여부는 변수가 생성된 목적에 따라 다릅니다. 클래스가 주문과 같은 일부 엔터티를 캡슐화하는 경우 주문 티켓과 같은 속성을 표현하려면 클래스에 정의된 변수가 필요합니다. 이러한 변수는 해당 클래스의 동일한 개체에 대해 지정된 클래스의 모든 메서드에 공통적입니다.

어떤 메소드 내에서 주기를 구성하기 위해 변수가 생성된 경우 메소드 내에서 자동으로 정의되어야 합니다(즉, static 키워드를 사용하지 않음). 이 경우 한 메서드가 루프 내부에서 다른 메서드를 호출하더라도 루프를 구성하고 동일한 이름의 변수를 사용하더라도 문제가 없습니다. 클래스에서 선언된 변수를 사용할 때 두 번째 메서드 루프에서 변수를 덮어씁니다.

자동 변수 의 경우, 메모리는 함수에 들어갈 때 자동으로 할당되고, 또한 최소한의 오버헤드로 종료할 때 자동으로 삭제됩니다. 게다가, 함수가 단순하다면 컴파일러는 자동 메모리를 할당하고 해제하기 위한 특별한 조치가 전혀 없는 코드를 생성할 수 있습니다.

이런 종류의 메모리 셀을 저장하는 것은 한때 의미 있는 활동이었지만 이 활동은 20년 전에 완전히 의미를 잃었습니다...

 

수업이 있습니다. 그는 매우 간단한 방법을 가지고 있습니다. 모두 수치스럽게 인쇄되었기 때문입니다. 나는 잼이 있는 곳을 찾고 있었다:

 // 1.5 Определяем минимальную разрядность лота. ===========================================================================================
int BaseInfo::LotPrecision()
{
   static int li_LotPrecision = 0 ;     // устанавливаем минимальную разрядность лота в ноль
   Print ( "LotPrecision()_Before: li_LotPrecision = " , li_LotPrecision);
   Print ( "LotPrecision()_BeforeCircle: SLots.gd_LotStep = " , SLots.gd_LotStep);
   while (SLots.gd_LotStep < 1 )
   {
       Print ( "LotPrecision(): SLots.gd_LotStep < 1" );
      SLots.gd_LotStep *= 10 ;
       Print ( "SLots.gd_LotStep *= 10" );
       Print ( "LotPrecision(): SLots.gd_LotStep = " , SLots.gd_LotStep);
      li_LotPrecision++;
       Print ( "LotPrecision(): li_LotPrecision = " , li_LotPrecision);
   }
   Print ( "LotPrecision(): LOTPRES = " , li_LotPrecision);
   return (li_LotPrecision);
}

li_LotPrecision 변수에는 정적 수식어가 없었지만 값을 잃지 않고 수정자를 변경했습니다. 수정자를 추가했음에도 불구하고 이 li_LotPrecision 변수는 값을 저장하지 않습니다.

OnInite() 에서 인쇄합니다.

 void OnTick ()
{
   int Lot = CBase.LotPrecision();
   Print ( "Lot = " , Lot);
}

로그에서:

 17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: SLots.gd_LotStep = MarketInfo ( _Symbol , MODE_LOTSTEP); = 0.01
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 0.01
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: SLots.gd_LotStep *= 10
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 0.1
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 1
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep < 1
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: SLots.gd_LotStep *= 10
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): SLots.gd_LotStep = 1.0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): li_LotPrecision = 2
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): LOTPRES = 2
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: Lot = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision(): LOTPRES = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: Lot = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_Before: li_LotPrecision = 0
17 : 26 : 03 2014.07 . 22 14 : 10   RSI EURUSD,M5: LotPrecision()_BeforeCircle: SLots.gd_LotStep = 1.0

여기서 LotPrecision() 함수를 종료한 후 li_LotPrecision 변수의 값이 손실되었음을 분명히 알 수 있습니다. 일정하게 유지하려면 어떻게 해야 합니까?

나중에 정적 수정자를 할당할 수 있도록 이 li_LotPrecision 변수를 클래스의 private 섹션에 추가하려고 시도 했지만 컴파일러 는 불가능하다고 맹세합니다.

unresolved static variable 'BaseInfo::li_LotPrecision'  BaseInfo.mqh    60      10

클래스에서 변수를 던지는 것은 이유가 되지 않습니다. 다른 곳에서는 필요하지 않습니다.

어떻게 될 것인가?