문제

방금 찾았습니다 ... 다시 ... 다음과 같이 실시간 낭비 버그

for (int i = 0; i < length; i++)
{ //...Lots of code 
    for (int j = 0; i < length; j++)
    {
        //...Lots of code 
    }
}

j 여야하는 내부 I를 똑바로 알았습니까? 나도 지금부터 나는 사용할 것입니다.

for (int i = 0; i < length; i++)
{
    for (int i1 = 0; i1 < length; i1++)
    {
    }
}

내부 및 외부 및 루프에 대한 팁은 무엇입니까?

편집 : 귀중한 응답에 감사드립니다. 제안 된 팁을 짧은 요약으로 다음과 같이하십시오.

  • 인덱스 변수에 의미있는 변수 이름을 사용합니다 (대신 objcollectionLength를 사용합니다).
  • 내부 루프의 내용을 별도의 방법으로 배치하고 해당 방법을 외부 루프에서 호출하십시오.
  • 외부와 내부 루프 사이의 관리 할 수없는 양의 코드 라인은 코드 냄새에 대한 강력한 신호입니다.
  • 사본 붙여 넣기 및 돌진을 피하고, 신중하게 색인 VAR을 작성하십시오.

요약을 확인하고 싶을 수도 있습니다 lbushkin수행원

  • 가능할 때마다 foreach 및 반복자를 사용하십시오
  • 루프에 들어가기 직전에 변수를 초기화하십시오
  • 각 루프가 하나의 기능 만 수행하도록합니다. 단일 루프에서 책임을 혼합하지 마십시오
  • 가능하면 루프가 한 번에 모두보기에 충분히 짧게 만드십시오.
도움이 되었습니까?

해결책

I & J (또는 기타 단일 문자 변수)를 색인 이름으로 사용하지 마십시오. 적절한 이름을 사용하면 이러한 유형의 문제가 발생하지 않습니다.

다른 팁

가장 간단하고 깨끗한 솔루션 중 하나는 내부 루프의 내용을 메소드에 배치하여 다음과 같이하는 것입니다.

for (int i = 0; i < length; i++)
{
    DoSomething();
}

private void DoSomething(int outerValue)
{
    for (int i = 0; i < length; i++)
    {
        // Do something else
    }

}

나를 위해, 여기 '코드 냄새'는 '많은 코드'입니다.

루프의 코드 양이 특히 크면 내부와 외부 루프 사이의 거리는 정확성을 위해 서로 비교할 가능성이 없음을 의미합니다.

분명히, 내부 루프의 시작을 고립시켜 보면 문제가주의를 기울여야하지만, 주요 구조를 가능한 한 작은 코드 섹션으로 사용하면 뇌가 소화되지 않습니다.

주 구조의 크기를 줄이기 위해 '많은 코드'섹션을 별도의 함수/방법으로 추출 할 수 있지만 이는 실용적이지 않을 수 있습니다.

또한 'i1'은 'i2', 'i3'등을 장려하는 경향이 있기 때문에 'i1'은 변수 이름을 잘 선택하지 않는다고 말하고 있습니다. 모든 루프 변수를 더 의미있는 것으로 바꾸면 코드의 명확성에 도움이되고 원래 오류의 가능성을 줄일 수 있습니다.

더 나은 루프 코드를 작성하기위한 나의 상위 조언 (특별한 순서가 없음) 코드 완료):

  1. 루프의 여러 출구 지점을 피하십시오.
  2. 계속해서/브레이크를 드물게 사용하십시오.
  3. Refactor는 가능하면 별도의 루틴으로 중첩되었습니다.
  4. 의미있는 변수 이름을 사용하여 중첩 루프를 읽을 수 있도록합니다.
  5. (i = ...) 루프보다는 가능한 경우 oreach () 루프를 사용하십시오.
  6. 한 위치에서만 루프를 입력하십시오. Goto와 함께 루프에 뛰어 들지 마십시오. 항상.
  7. 루프 직전에 초기화 코드를 넣으십시오.
  8. 관련 루프를 사용하여 루프 초기화 명세서를 유지하십시오.
  9. 비 네스트 루프 사이의 변수를 재사용하지 마십시오. 10. 루프-인덱스 변수의 범위를 루프 자체로 제한하십시오.
  10. (;;)보다는 무한 루프에 대한 (true)를 사용합니다.
  11. 블록 구조물 (예 : '{'및 '}')을 제공하는 언어에서는 루프의 진술을 동봉하기 위해 들여 쓰기 대신 사용합니다. 예, 단일 라인 루프의 경우에도.
  12. 빈 루프를 피하십시오.
  13. 고리 한가운데에 집안일을 배치하지 말고 처음에 배치하거나 대신 종료하십시오.
  14. 각 루프가 하나의 기능 만 수행하도록합니다. 단일 루프에서 책임을 혼합하지 마십시오.
  15. 루프 종료 조건을 분명하게 만듭니다.
  16. () 루프의 루프 인덱스 변수가 종료되도록 원숭이를 사용하지 마십시오.
  17. 루프 인덱서의 최종 값에 의존하는 코드를 피하십시오.
  18. 복잡한 루프에서 안전 카운터를 사용하는 것을 고려하십시오. 루프가 너무 많거나 너무 적은 시간을 실행하지 않도록 확인할 수 있습니다.
  19. 가능한 경우 브레이크 명령문을 사용하여 루프를 종료하십시오.
  20. 가능하면 루프를 한 번에 볼 수있을 정도로 짧게 만듭니다.

그것은 사본-페이스트 실수입니다. 복사 페이스트를 피하십시오.

솔루션에 관해서는 훨씬 나아지지 않습니다. 실수는 여전히 많은 코드 사이에서 미끄러질 수 있습니다. 루프 임시 변수에도 의미있는 이름을 사용하는 경향이 있습니다.

VS에서 IDE를 활용하십시오. http://msdn.microsoft.com/en-us/library/z4c5cc9b(vs.80).aspx

샘플 : 유형 ~을 위한, 그런 다음 누릅니다 탭 탭 연속적으로

나는 똑똑하기 위해 여기에 와서 "나는 처음으로 그것을 썼다"고 말합니다. 그러나 나는 당신의 모범을 보았고 글쎄, 나는 그렇게 많은 시간을 스스로 해냈습니다.

그런 중첩 루프가 필요할 때, 내 유일한 솔루션은 코드를 작성할 때 경고하고 생각하는 것입니다.

가능하면 반복자와 각 루프를 사용하는 것이 좋습니다.

또한 제안 된 솔루션이 어떻게 더 나아질 지 알 수 없습니다. 그리고 그것은 멋지게 보이지 않습니다.

우선, 루프 본체 크기를 줄입니다. 즉, 물건을 별도의 기능으로 이동하십시오. 일반적으로 화면에 들어갈 수있는 것보다 기능이 더 길어지는 것은 나쁜 생각이므로 루프가 더 작아야합니다.

둘째, 이와 같은 경우 의미있는 변수 이름을 사용하십시오. 몇 줄의 코드가있는 간단한 루프에서만 I와 J를 사용합니다. 예를 들어, 2 차원 배열을 겪고 있다면 "Col"및 "Row"는 훨씬 더 의미가 있으면 코드를 쉽게 읽을 수 있고 ( "Was?") 이와 같은 실수를 더 쉽게 찾을 수 있습니다.

당신은 그러한 문제를 추가로 관리해야합니다. 이것에 대한 마법의 총알은 없습니다. "더 나은 이름 지정"에도 불구하고, 당신은 당신이 가끔씩 NESTED 루프의 n+m) TH 레벨인지 여부를 추적하고 오류를 일으킬 것이라고 제안합니다.

중첩 루프가 필요한 경우 조심스럽게 작성하십시오. 외부 루프 본체를 지수 오용에 대한 좋은 가드가 될 함수로 추출하여 피할 수있는 경우.

과도 루프 카운터에 'II'와 'jj'를 실제로 필요로하는 경우 'II'와 'jj'를 사용합니다. 'I'와 'J'보다 검색하기가 더 쉽고 위와 같은 예에서는 쉽게 찾을 수 있습니다. 더 잘 가려면 실제로 실제 변수 이름을 사용할 수 있습니다. 문자열 위로 반복하는 경우 characterIndex 또는 무언가를 부를 수 있습니다. 더 유형이지만, 자체를 문서화하고 나중에 모호한 문제를 모호하게하는 데 시간을 절약합니다.

여전히 수치 카운터를 피하고 컬렉션을 통해 명명 된 반복자를 사용하는 것입니다. 그들은 내 생각에 의도를 더 명확하게 만듭니다.

마지막으로, 가능하면 루프를 완전히 없애는 것이 좋습니다. 부스트 :: foreach C ++ 에서이 작업을 수행하는 한 가지 방법이지만, 일반적으로 인덱스 값이나 반복기를 증가시킬 필요없이 컨테이너의 내용을 직접 반복 할 수있는 Python과 같은 언어를 사용하는 것을 선호합니다.

더 많은 선언 루프 구성을 사용하십시오. 예를 들어, 실제로 지수가 필요하지 않은 경우 ( i모래 js) 및 귀하의 프로그래밍 환경이 허용되면 foreach 컬렉션을 반복하도록 구성하십시오.

많은 것들에서와 마찬가지로 Steve McConnell의 훌륭한 조언이 있습니다. 코드 완료. 좋은 루핑 코드 구축에 대해 그가 말한 내용을 읽는 것이 당신의 시간의 가치가 있습니다. 나는 여기에 편리한 책의 사본이 없지만 책 전체는 당신의 시간의 가치가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top