ABAP Clean Code

ABAP 클린 코드 - METHOD 메서드 (호출) [10-1]

Dev Do 2024. 8. 24. 23:30
반응형
“절차적인 콜(procedural call)보다 펑션콜(functional call)을 사용하라”는 지침은 절차적 프로그래밍 방식보다 함수형 프로그래밍의 스타일을 선호하라는 의미입니다. 이는 코드의 가독성, 유지보수성, 테스트 용이성을 높이기 위한 설계 원칙 중 하나로, 특히 상태를 변경하는 부작용(side effect)을 최소화하고, 명확한 입력과 출력을 가진 함수들을 사용하는 것이 좋다는 것을 강조합니다.

 

함수형 패턴 적용의 필요성

  • 함수형 프로그래밍에서는 함수가 입력을 받아 출력을 반환할 뿐, 외부 상태를 변경하지 않습니다. 이러한 함수형 접근법은 코드의 가독성을 높이고, 디버깅 및 테스트를 쉽게 만들어 줍니다.
  • 함수형 프로그래밍 방식으로 코드를 리팩토링하면, 코드의 의도를 더 명확히 표현할 수 있으며, 상태 변경이 어디에서 발생하는지 쉽게 파악할 수 있습니다. 객체의 상태 변경을 최소화하고, 가능하면 순수 함수(pure function)를 사용해 데이터를 처리하는 방식으로 전환하는 것이 좋습니다.
* 기존 절차적 패턴
CALL METHOD modify->update
  EXPORTING
    node           = /dirty/my_bo_c=>node-item
    key            = item->key
    data           = item
    changed_fields = changed_fields.

* 함수형 스타일로 리팩토링
DATA(lv_updated_item) = modify->update_item(
  node           = /dirty/my_bo_c=>node-item
  key            = item->key
  data           = item
  changed_fields = changed_fields ).

 

개선 사항 설명

1. 상태 변경 최소화

  • update_item 메서드는 상태를 직접 변경하는 대신, 입력을 받아 새로운 데이터를 반환하도록 설계되었습니다. 이를 통해 함수형 프로그래밍의 원칙을 적용하여 외부 상태에 영향을 미치지 않게 했습니다.

2. 순수 함수로 리팩토링

  • 함수형 접근은 동일한 입력이 주어지면 항상 동일한 출력을 반환하는 순수 함수의 개념을 따릅니다. update_item은 입력값에 따라 변경된 데이터를 반환하지만, 외부 상태는 변경하지 않습니다.

3. 가독성 향상

  • 상태를 직접적으로 변경하지 않고, 데이터 처리가 한 번의 함수 호출로 이루어지기 때문에 코드의 가독성이 높아집니다. 무엇을 수행하는지 명확하게 나타내고, 각 함수의 목적이 분명해집니다.

4. 유지보수 용이성

  • 상태를 반환하는 방식으로 변경함으로써, 여러 곳에서 상태 변경이 발생하는 것을 피하고, 코드 유지보수가 쉬워집니다. 또한, 함수형 스타일의 코드는 테스트하기도 쉽습니다.
이 지침은 절차적인 방식으로 상태를 변경하는 코드보다 함수형 스타일로 상태를 처리하는 코드를 선호하라는 의미입니다. 절차적인 메서드 호출 방식은 상태 관리가 복잡해지고, 코드의 의도를 이해하기 어려워지며, 유지보수가 힘들어집니다. 반면, 함수형 스타일로 리팩토링하면 상태 변경을 최소화하고, 코드의 가독성과 유지보수성을 크게 개선할 수 있습니다.

 

“RECEIVING을 생략하라“는 ABAP 코딩 스타일에 대한 지침으로, 메서드 호출 시 RECEIVING 구문을 생략하고 RETURNING 구문을 사용하는 것이 더 간결하고 가독성이 좋다는 의미입니다. 이는 ABAP에서 메서드의 반환 값을 처리할 때, RECEIVING을 사용하기보다는 직접 RETURNING 구문을 활용해 변수를 초기화하는 것이 더 나은 방식이라는 것을 강조합니다.

 

RECEIVING과 RETURNING의 차이

 

1. RECEIVING

  • 메서드의 반환값을 RECEIVING 구문을 통해 받는 방식입니다. 반환된 값은 RECEIVING으로 지정된 변수에 저장됩니다.
  • 이 구문은 메서드 호출 이후 별도로 반환값을 처리하는 방식으로, 다소 장황할 수 있습니다.
* RECEIVING 사용
CALL METHOD lo_object->get_value
  RECEIVING
    rv_value = lv_result.

 

2. RETURNING

  • 메서드에서 반환된 값을 직접 RETURNING 구문으로 처리하는 방식입니다. 이 구문은 메서드 호출 결과를 바로 변수에 할당할 수 있어 코드가 더 간결해집니다.
  • RETURNING은 메서드가 반환하는 값을 호출하는 곳에서 바로 받아 변수에 할당할 수 있으므로, 코드의 가독성과 효율성을 높일 수 있습니다.
* RECEIVING 생략
DATA(lv_result) = lo_object->get_value( ).

 

“RECEIVING을 생략하라“는 ABAP에서 메서드 호출 시 반환값을 처리할 때 RECEIVING 구문보다 RETURNING 구문을 사용하여 더 간결하고 가독성 좋은 코드를 작성하라는 의미입니다. RETURNING 구문을 사용하면 코드가 더 직관적이고 효율적이며, 유지보수하기도 쉽습니다. 상황에 맞게 RETURNING 구문을 활용함으로써, 더 나은 품질의 코드를 작성할 수 있습니다.

 

“불필요한 EXPORTING 구문을 생략하라”는 ABAP 코드 작성 시 EXPORTING 구문을 불필요하게 사용하는 것을 피하라는 지침입니다. 이 지침은 특히 메서드나 함수 모듈 호출 시, 명시적으로 EXPORTING 구문을 작성하지 않아도 되는 경우, 이를 생략함으로써 코드를 간결하게 유지하고 가독성을 높이자는 취지입니다.

 

EXPORTING 구문의 역할

  • EXPORTING 구문은 메서드나 함수 모듈을 호출할 때, 호출하는 쪽에서 해당 메서드 또는 함수에 인수를 전달하기 위해 사용됩니다. EXPORTING 구문을 사용하면 호출하는 메서드에 값을 전달할 수 있습니다.
* EXPORTING 구문 사용
CALL METHOD lo_object->set_value
  EXPORTING
    iv_value = lv_value.

 

* EXPORTING 구문 생략
lo_object->set_value( iv_value = lv_value ).

 

왜 EXPORTING 구문을 생략해야 하는가?

 

1. 코드 간결성

  • EXPORTING 구문을 생략하면 코드가 더 간결해지고, 불필요한 반복이 줄어듭니다. 메서드나 함수 호출 시 기본적인 인수 전달을 위해 매번 EXPORTING을 작성할 필요가 없으므로, 코드가 더 짧아집니다.

2. 가독성 향상

  • 불필요한 EXPORTING 구문을 제거하면 코드의 가독성이 향상됩니다. 함수나 메서드 호출 시 주요 로직이 더 명확하게 드러나며, 불필요한 정보로 인해 혼동을 일으킬 가능성이 줄어듭니다.

3. 일관성 유지

  • ABAP에서는 EXPORTING 구문이 명시적으로 필요하지 않은 경우가 많기 때문에, 이를 생략함으로써 코드의 일관성을 유지할 수 있습니다. 다른 메서드 호출이나 함수 호출에서 이미 EXPORTING 구문을 생략하고 있다면, 동일한 스타일을 유지하는 것이 좋습니다.

4. 최신 ABAP 스타일 준수

  • 최신 ABAP 문법에서는 이러한 구문 생략이 권장되고 있으며, 더 현대적인 코드 스타일을 따르는 것이 바람직합니다. 이를 통해 코드가 더 직관적이고 현대적인 ABAP 스타일에 맞게 작성될 수 있습니다.
“불필요한 EXPORTING 구문을 생략하라”는 메서드나 함수 호출 시 불필요한 EXPORTING 구문을 생략하여 코드의 간결성과 가독성을 높이자는 지침입니다. 최신 ABAP 스타일에서는 이러한 구문 생략이 권장되며, 이를 통해 코드가 더 깔끔하고 직관적으로 보일 수 있습니다. 코드를 작성할 때 이러한 스타일 가이드를 준수하여, 더 나은 품질의 코드를 유지하는 것이 중요합니다.

 

“단일 파라미터 콜에서는 파라미터명을 생략하라“는 ABAP 코딩 스타일에 대한 지침으로, 메서드나 함수 호출 시 단일 파라미터만 전달할 경우에는 파라미터명을 명시하지 않아도 된다는 의미입니다. 파라미터명을 생략하면 코드가 더 간결해지고, 가독성이 향상될 수 있습니다. 이 지침은 특히 하나의 인수만 필요로 하는 경우에 유용합니다.

 

파라미터명을 명시하지 않는 방식

  • ABAP에서는 메서드나 함수 호출 시 전달하는 파라미터의 이름을 명시하는 것이 일반적이지만, 단일 파라미터인 경우 파라미터명을 생략할 수 있습니다. 이를 통해 코드를 더 간결하게 만들 수 있습니다.
* 파라미터명 명시
lo_object->set_value( iv_value = lv_value ).

 

* 파라미터명 생략
lo_object->set_value( lv_value ).

 

 

파라미터명을 생략해야 하는 이유

 

1. 코드 간결성

  • 단일 파라미터를 전달할 때 파라미터명을 생략하면, 코드가 더 간결해지고 불필요한 반복을 줄일 수 있습니다. 파라미터명을 명시하지 않아도 전달하려는 값이 명확하다면, 생략하는 것이 좋습니다.

2. 가독성 향상

  • 파라미터명이 생략된 코드는 더 직관적으로 보일 수 있습니다. 단일 파라미터만 전달될 때는 파라미터명을 굳이 명시하지 않아도 해당 값이 무엇을 의미하는지 쉽게 파악할 수 있습니다.

3. 불필요한 정보 제거

  • 단일 파라미터의 경우 파라미터명을 명시하는 것은 불필요한 정보가 될 수 있습니다. 코드에서 중요한 부분은 파라미터의 값이지, 파라미터명 자체가 아닙니다. 따라서 파라미터명을 생략하여 중요한 정보를 더 부각할 수 있습니다.

 

언제 파라미터명을 생략해야 하는가?

 

1. 단일 파라미터인 경우

  • 메서드나 함수가 단일 파라미터만 받는다면, 파라미터명을 생략하는 것이 좋습니다. 파라미터가 하나뿐이라면, 코드의 맥락에서 무엇이 전달되는지 명확하게 드러나므로 파라미터명을 명시할 필요가 없습니다.

2. 파라미터의 의미가 명확한 경우

  • 전달되는 값의 의미가 명확하고, 파라미터명이 없어도 혼동되지 않는다면 생략하는 것이 좋습니다. 코드의 흐름에서 전달되는 값이 무엇을 의미하는지 충분히 예측할 수 있는 경우, 파라미터명을 생략해도 문제가 없습니다.

 

언제 파라미터명을 명시해야 할까?

  • 다수의 파라미터가 있을 때: 여러 개의 파라미터를 전달하는 경우, 각 파라미터의 이름을 명시하는 것이 코드의 명확성을 높일 수 있습니다. 이때는 파라미터명을 명시하여 어떤 값이 어떤 파라미터에 할당되는지 분명히 해야 합니다.
  • 파라미터의 의미가 모호할 때: 전달되는 값의 의미가 명확하지 않거나, 파라미터의 역할이 코드의 맥락에서 쉽게 파악되지 않는 경우에는 파라미터명을 명시하는 것이 좋습니다
“단일 파라미터 콜에서는 파라미터명을 생략하라“는 단일 파라미터를 전달할 때는 파라미터명을 명시적으로 작성하지 않고 생략하여 코드를 더 간결하게 만들라는 의미입니다. 파라미터명이 없어도 전달하는 값이 명확하다면, 이를 생략함으로써 코드의 가독성을 높이고 불필요한 반복을 피할 수 있습니다. 다만, 파라미터명이 필요하거나 여러 파라미터가 있는 경우에는 명시적으로 작성하는 것이 더 바람직할 수 있습니다.

 

“인스턴스 메서드를 호출할 때는 자기 참조를 생략하라“는 ABAP 코딩 스타일 지침으로, 인스턴스 메서드를 호출할 때 ME->를 명시적으로 사용하지 않고 생략하라는 의미입니다. 이는 코드의 가독성을 높이고 불필요한 참조를 줄이기 위한 권장 사항입니다.

 

ME-> 구문의 의미

  • ME->는 ABAP에서 자기 참조(self-reference)를 나타냅니다. 객체 내부에서 자신의 인스턴스 메서드를 호출할 때, ME->를 사용하여 해당 메서드를 호출할 수 있습니다.
* 자기 참조 메서드
METHODS: do_something.

METHOD do_something.
  ME->another_method( ).
ENDMETHOD.

 

자기 참조 생략의 장점

 

1. 코드 간결성

  • ME-> 구문을 생략하면 코드가 더 간결해지고, 읽기 쉬워집니다. 불필요한 참조를 줄임으로써 코드의 복잡도를 낮출 수 있습니다.

2. 가독성 향상

  • 자기 참조를 생략하면, 코드에서 무엇이 중요한지 더 쉽게 파악할 수 있습니다. 메서드 호출 시 ME->가 불필요하게 반복되면 코드가 복잡해 보일 수 있지만, 이를 생략하면 코드의 주요 로직에 더 집중할 수 있습니다.

3. 일관성 유지

  • 다른 객체 지향 언어들(예: Java, Python)에서도 자기 참조(this, self)를 생략하는 것이 일반적입니다. ABAP에서도 이러한 스타일을 적용하면, 다른 언어와의 일관성을 유지할 수 있으며, ABAP 코드가 더 현대적이고 일관성 있게 보입니다.
* 자기 참조 메서드
CLASS lcl_example DEFINITION.
  PUBLIC SECTION.
    METHODS: do_something,
             another_method.
ENDCLASS.

CLASS lcl_example IMPLEMENTATION.
  METHOD do_something.
    ME->another_method( ).
  ENDMETHOD.

  METHOD another_method.
*     로직 수행
  ENDMETHOD.
ENDCLASS.

 

* 자기 참조 메서드 생략
CLASS lcl_example DEFINITION.
  PUBLIC SECTION.
    METHODS: do_something,
             another_method.
ENDCLASS.

CLASS lcl_example IMPLEMENTATION.
  METHOD do_something.
    another_method( ).
  ENDMETHOD.

  METHOD another_method.
*     로직 수행
  ENDMETHOD.
ENDCLASS.

 

언제 ME->를 사용해야 할까?

 

1. 외부 객체와의 혼동 방지

  • 만약 클래스 내에서 인스턴스 메서드 호출이 외부 객체의 메서드 호출과 혼동될 수 있는 경우, ME->를 명시적으로 사용하는 것이 좋습니다. 이 경우 ME->를 사용하여 메서드 호출이 현재 객체의 메서드임을 명확히 할 수 있습니다.

2. 코드의 명확성을 위해

  • 코드가 복잡하고, 여러 객체 간 메서드 호출이 발생하는 경우, ME->를 사용해 코드의 명확성을 높일 수 있습니다. 특히, 외부 메서드와 내부 메서드를 구분해야 할 때는 ME->를 사용하는 것이 바람직할 수 있습니다.
“인스턴스 메서드를 호출할 때는 자기 참조를 생략하라“는 ABAP 코드에서 인스턴스 메서드를 호출할 때, 불필요한 자기 참조인 ME->를 생략해 코드의 간결성과 가독성을 높이자는 의미입니다. 동일한 클래스 내에서 메서드를 호출할 때는 ME->를 생략해도 문제가 없으며, 코드가 더 명확하고 간결하게 작성될 수 있습니다. 다만, 외부 객체와의 혼동을 방지하기 위해 필요한 경우에는 ME->를 명시적으로 사용하는 것도 고려할 수 있습니다.
반응형