ABAP Clean Code

ABAP 클린 코드 - 상수 [1]

Dev Do 2024. 8. 13. 00:08
반응형
“매직 넘버 대신 상수를 사용하라”는 지침은 코드의 품질을 높이는 좋은 습관입니다. 상수를 사용하여 코드의 의미를 명확히 하고, 가독성과 유지보수성을 높이며, 오류의 가능성을 줄일 수 있습니다.

매직 넘버란?

매직 넘버는 코드에 하드코딩된 숫자, 문자열, 또는 기타 리터럴 값으로, 이 값이 무엇을 의미하는지 명확하게 설명되지 않은 경우를 말합니다. 

* 잘못된 패턴
IF lv_number = 1.
  'Number 1'.
ENDIF.

위 코드에서 1은 매직 넘버입니다. 코드의 문맥만으로는 1이 무엇을 의미하는지 알기 어렵습니다.

 

매직 넘버의 문제점

  1. 가독성 저하: 코드를 읽는 사람이 1이 무엇을 의미하는지 추측해야 합니다.
  2. 유지보수 어려움: 만약 1이라는 값을 여러 곳에서 사용하고 있고, 나중에 이 값을 2으로 변경해야 한다면, 코드의 모든 1을 찾아서 바꿔야 합니다. 실수로 일부를 놓치거나 잘못된 값을 변경할 수 있습니다.
  3. 의미 불명확: 매직 넘버는 코드의 의미를 불분명하게 만듭니다. 예를 들어, 1이 어떤 제한 값인지, 최대 값인지, 특정 계산의 기준인지 알 수 없습니다.

상수를 사용하는 이유

 

상수(Constant)는 이러한 문제를 해결하는 방법입니다. 상수를 사용하면 코드의 의미를 명확히 하면서, 값의 재사용성을 높이고 유지보수를 쉽게 할 수 있습니다.

 

위 예제를 상수를 사용하도록 바꿔보겠습니다.

* 매직 넘버 사용안하고 상수 사용
CONSTANTS c_code_number TYPE i VALUE 1.

IF lv_number = c_code_number.
  'Number 1'.
ENDIF.

 

상수를 사용하는 장점

  1. 가독성 향상: c_max_threshold라는 상수명을 보면, 이 값이 어떤 의미를 가지고 있는지 바로 알 수 있습니다. 이 예시에서는 임계값(threshold)을 나타낸다는 것을 알 수 있습니다.
  2. 유지보수 용이: 나중에 이 값을 변경해야 할 경우, 상수의 값을 한 곳에서만 수정하면 됩니다. 그 결과, 실수의 가능성이 줄어듭니다.
  3. 의미 명확화: 코드에서 1이 어떤 의미를 갖는지 명확히 표현할 수 있습니다.
“상수 인터페이스보다 상수 클래스를 선호하라”는 지침은 유지보수성과 코드 가독성을 높이기 위한 것입니다.

 

상수 인터페이스(Constant Interface)란?

상수 인터페이스는 인터페이스에 상수를 정의하고, 이를 여러 클래스에서 상속받아 사용하는 방식입니다. 

*  잘못된 패턴
INTERFACE zconstants_01
  PUBLIC .
  CONSTANTS:
    c_success_inf TYPE symsgty VALUE 'S',
    c_error_inf   TYPE symsgty VALUE 'E'.
  ENDINTERFACE.

 

상수 인터페이스의 문제점

  1. 의미적 부적합성: 인터페이스는 주로 클래스가 구현해야 할 메서드를 정의하는 데 사용됩니다. 상수만을 정의하기 위해 인터페이스를 사용하는 것은 의도와 맞지 않으며, 유지보수할 때 혼란을 야기할 수 있습니다.
  2. 모호한 사용: 클래스에서 상수를 사용할 때 인터페이스를 상속받아야 하며, 이는 클래스의 실제 기능과 관련이 없는 상속 구조를 만들 수 있습니다.

상수 클래스(Constant Class)란?

상수 클래스는 여러 개의 상수를 모아놓고 관리하기 위해 특별히 설계된 클래스를 말합니다. 이 클래스는 주로 프로그램 전반에서 공통으로 사용되는 상수 값을 중앙에서 관리하고자 할 때 사용됩니다. 상수 클래스는 객체를 생성하지 않고 클래스 이름을 통해 상수를 직접 참조할 수 있도록 만들어지며, ABAP에서는 보통 FINAL로 선언하여 상속되지 않도록 설정합니다.

* 인터페이스 상수 대신 클래스 상수 사용
CLASS zconstants DEFINITION
  PUBLIC ABSTRACT FINAL
  CREATE PUBLIC .
  PUBLIC SECTION.
    CONSTANTS:
      c_success TYPE symsgty VALUE 'S',
      c_error   TYPE symsgty VALUE 'E'.
    CLASS-DATA:
      c_success_ref TYPE REF TO zconstants,
      c_error_ref   TYPE REF TO zconstants.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS zconstants IMPLEMENTATION.
ENDCLASS.

 

상수 클래스의 장점

  1. 중앙화된 관리: 모든 상수를 한곳에 모아 관리할 수 있어, 코드의 일관성을 유지하고 수정이 용이합니다.
  2. 코드 가독성: 상수의 의미를 명확히 표현할 수 있으며, 코드의 가독성을 높입니다.
  3. 유지보수 용이성: 만약 상수의 값이 변경되어야 할 경우, 상수 클래스의 정의만 수정하면 되므로 코드의 유지보수가 간편해집니다.
  4. 코드 재사용성: 상수 클래스는 재사용 가능하기 때문에, 여러 프로그램이나 클래스에서 상수를 공유할 수 있습니다.
“열거체를 사용하지 않는다면 상수들을 그룹화하라”는 지침은 상수들을 논리적으로 관련된 그룹으로 묶어 관리함으로써 코드의 가독성과 유지보수성을 높이자는 원칙입니다. 열거체가 없는 언어, 또는 열거체를 사용할 수 없는 상황에서 특히 유용합니다.

 

상수들을 그룹화해야 하는 이유

  1. 코드 가독성 향상: 관련된 상수들을 하나의 그룹으로 묶으면 코드에서 상수의 의미를 더 쉽게 파악할 수 있습니다.
  2. 유지보수성 향상: 상수 값이 변경될 때, 관련된 모든 상수들이 한곳에 모여 있으면 수정이 간편합니다.
  3. 재사용성 증가: 특정 기능이나 모듈에서 사용할 상수들을 그룹화하면, 이를 다른 프로그램이나 모듈에서 쉽게 재사용할 수 있습니다.
*  잘못된 패턴
CONSTANTS:
  c_success      TYPE symsgty VALUE 'S',
  c_error        TYPE symsgty VALUE 'E'.

 

* 상수를 그룹화하여 사용
CONSTANTS:
  BEGIN OF status,
    c_success TYPE symsgty VALUE 'S',
    c_error   TYPE symsgty VALUE 'E',
  END OF status,

 

열거체를 사용할 수 없을 때, 상수들을 그룹화하여 관리하는 것은 코드의 품질을 높이는 좋은 방법입니다. ABAP에서는 이러한 상수 그룹화를 위해 상수 클래스를 사용하는 것이 일반적이며, 이를 통해 코드의 가독성, 유지보수성, 그리고 재사용성을 크게 향상시킬 수 있습니다.

반응형