2014-07-07 4 views
-2

ABAP에서 가장 중첩 된 루프에서 가장 바깥 쪽 루프를 계속 수행 할 수있는 방법이 있습니까?가장 중첩 된 루프에서 가장 바깥 쪽 루프 계속

Java의 예. 이 언어에는 레이블을 사용하는 구조가 있습니다. 대부분의 사람들은 중첩 된 루프에서 가장 바깥 쪽 루프를 계속할 수 있습니다.

public class NestedLoopContinue { 
    public static void main(String[] args) {  
     label1: for (int i = 0; i < 5; i++) { 
      for (int j = 0; j < 2; j++) { 
       if (i == 3) { 
        continue label1; 
       } 
      } 
      System.out.println(i + 1); 
     } 
    } 
} 

이 지금

1 
2 
3 
5 

출력, 나는 똑똑한 방법으로 ABAP에서 그것을 할 수 있습니까? 한 가지 해결책은 TRY. ENDTRY. 블록을 사용하는 것이지만 해킹 방법입니다. 다른 아이디어?

DATA: l_outer_counter TYPE i. 
DO 5 TIMES. 
    l_outer_counter = sy-index. 
    TRY. 
    DO 2 TIMES. 
     IF l_outer_counter = 4. 
     RAISE EXCEPTION TYPE cx_abap_random. 
     ENDIF. 
    ENDDO. 
    WRITE/l_outer_counter. 
    CATCH cx_abap_random. 
     CONTINUE. 
    ENDTRY. 
ENDDO. 

또는 어쩌면 DO. ENDO.이 (SYST 전역 변수와 같은 과정의 자신의 변수를 도입하지 않고)는 EXIT 문으로 종료 여부를 알 수있는 방법은 무엇입니까?

DATA: l_outer_counter TYPE i. 
DO 5 TIMES. 
    l_outer_counter = sy-index. 
    DO 2 TIMES. 
    IF l_outer_counter = 4. 
     EXIT. 
    ENDIF. 
    ENDDO. 
    IF sy-last_loop_ended_with_exit = abap_true. "??? 
    CONTINUE. 
    ENDIF. 
    WRITE/l_outer_counter. 
ENDDO. 
+0

호기심에서 벗어난 -이 실제적인 응용 프로그램은 무엇입니까? – vwegert

+0

@vwegert 예, 실용적인 응용 프로그램이 있습니다. 사실 나는'LOOP AT'를 사용합니다.내가 가지고있는 바깥 쪽 루프에는 객체가 들어 있는데, 안쪽 루프에는 바깥 쪽 루프에서 얻은 식별자로 호출하는 동일한 인터페이스 구현에 대한 참조가 들어 있습니다. 메소드 호출의 결과에 기초하여 다음 outer 루프 객체로 진행하거나 내부 루프의 나머지 부분과 외부'ENDLOOP' 앞에 오는 것을 계속하고 싶습니다. – Jagger

+0

나는 질문을 편집했다. 루프를 끝낼 때 ('SY' 플래그 중 하나 일까?) 'EXIT'가 있었는지 여부를 알려주는 방법도이 경우에 좋은 대안이 될 것입니다. 그러면이 플래그에 기반한 'CONTINUE'가 가능합니다. – Jagger

답변

3

중첩 루프를 사용하는 경우 가독성을 향상시키고 예외적 인 접근 방법을 사용하는 것을 피하는 것이 가장 좋은 방법입니다 (예 : 고토와 유사한 특성으로 인해 논쟁의 여지가있을뿐만 아니라 줄이기 많은 사람들이 익숙하지 않기 때문에 가독성)은 내부 루프를 별도의 함수로 추출하는 것입니다. 나는이가 ABAP에서 수행하는 방법을 모르겠지만 리팩토링 자바 상응하는 것 : 두 걸쳐 논리를 따라 열심히하기 때문에

public class NestedLoopContinue { 

    public static void main(String[] args) { 
     for (int i = 0; i < 5; i++) { 
      NestedLoopContinue.innerLoop(i) 
     } 
    } 

    static void innerLoop(int i) { 
     for (int j = 0; j < 2; j++) { 
      if (i == 3) { 
       return; 
      } 
     } 
     System.out.println(i + 1); 
    } 
} 

나는이 예제에서 주장이 사실은 덜 읽을된다 행동 양식. 그러나 이것이 실제 사례 (메서드와 변수에 실제 의미와 적절한 이름이있는 경우) 인 경우 별도의 메서드로 내부 루프를 추출한 결과 레이블을 사용하는 것보다 읽기 쉽습니다.

+0

이것은 실제로 아주 좋아 보인다. 물론 ABAP에서 같은 것을 구현하는 것은 문제가되지 않습니다. 힌트를 가져 주셔서 감사합니다! – Jagger

9

ABAP 관련 솔루션에 대해 잘 모릅니다. 그러나 이전에는이를 처리하기 위해 일반적인 프로그래밍 솔루션을 사용했습니다. 단순히 부울을 사용하고 내부 루프의 끝에서 계속할지 여부를 확인하십시오.

public class NestedLoopContinue 
{ 
    public static void main(String[] args) 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      boolean earlyBreak = false; 
      for (int j = 0; j < 2; j++) 
      { 
       if (i == 3) 
       { 
        earlyBreak = true; 
        break; 
       } 
      } 
      if (earlyBreak) 
      { 
       continue; 
      } 
      System.out.println(i + 1); 
     } 
    } 
} 

그리고 ABAP에서 : 자바에서

DATA: l_outer_counter type i, 
     early_break type FLAG. 

DO 5 TIMES. 
    l_outer_counter = sy-index. 

    DO 2 TIMES. 
     IF l_outer_counter = 4. 
     early_break = ABAP_TRUE. 
     EXIT. 
     ENDIF. 
    ENDDO. 

    IF early_break = ABAP_TRUE. 
     CLEAR early_break. 
     CONTINUE. 
    ENDIF. 

    WRITE/l_outer_counter. 

ENDDO. 

나는 GOTO 문을 명시 적으로하지 않기 때문에 레이블 기반 휴식은 처음에 자바에 존재하는 이유는 읽었습니다 레이블 기반 휴식 시간의 경우는 GOTO의 "좋은"용도 중 하나였으며 팀에서 유지 관리하기를 원했습니다.

일반적으로 이것은 매우 어색한 구성입니다. 코드를 리팩토링하는 잠재적 인 방법이 없을까요? (아마도 루프의 내부를 바꿔 놓을 것입니다) 이것이 처음부터 필요성을 없애 줍니까?

-1

robjohncox 답변에 따르면 ABAP 코드는 다음과 같을 수 있습니다.

CLASS lcl_nested_loop_continue DEFINITION FINAL. 
    PUBLIC SECTION. 
    CLASS-METHODS: 
     main. 
    PRIVATE SECTION. 
    CLASS-METHODS: 
     inner_loop 
     IMPORTING 
      i_index TYPE i. 
ENDCLASS. 

CLASS lcl_nested_loop_continue IMPLEMENTATION. 
    METHOD main. 
    DO 5 TIMES. 
     lcl_nested_loop_continue=>inner_loop(sy-index). 
    ENDDO. 
    ENDMETHOD. 

    METHOD inner_loop. 
    DO 2 TIMES. 
     IF i_index = 4. 
     RETURN. 
     ENDIF. 
    ENDDO. 
    WRITE/i_index. 
    ENDMETHOD. 
ENDCLASS. 
관련 문제