λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

ABAP Implimentation (πŸ› οΈμ‹€λ¬΄)/Clean ABAP

ABAP Clean Code : λ³€μˆ˜μ™€ λ¦¬ν„°λŸ΄(Variables and Literals) - μƒμˆ˜(Constants)

이 글은 γ€ŽClean ABAP – A Style Guide for Developers』 μ„œμ  (written by Klaus Haeuptle, Florian Hoffmann, Rodrigo Jordão, Michel Martin, Anagha Ravinarayan, Kai Westerholz)을 μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή λ‚΄μš©μ„ μ’€ 더 쉽고 이해할 수 μžˆλ„λ‘ μš”μ•½/정리 및 개인적인 μ˜κ²¬μ„ λΆ™μ—¬ μž¬κ΅¬μ„±ν•œ  ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. 

 

 

 

ABAP을 처음 λ°°μš°λ‹€ 보면 λ³€μˆ˜μ™€ μƒμˆ˜μ˜ 차이λ₯Ό ν—·κ°ˆλ¦¬κΈ° 쉽닀. 특히 μœ μ§€λ³΄μˆ˜λ‚˜ ν™•μž₯이 μ‰¬μš΄ 클린 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ €λ©΄, μƒμˆ˜λ₯Ό μ œλŒ€λ‘œ μ •μ˜ν•˜κ³  μ‚¬μš©ν•˜λŠ” 것이 ꡉμž₯히 μ€‘μš”ν•˜λ‹€. 이번 κΈ€μ—μ„œλŠ” ABAPμ—μ„œ μƒμˆ˜λ₯Ό ν™œμš©ν•΄ μ½”λ“œλ₯Ό 더 읽기 쉽고, 였λ₯˜λ‘œλΆ€ν„° λ°©μ§€ν•  수 방법을 μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.


1. 맀직 λ„˜λ²„(Magic Number)λ₯Ό ν”Όν•˜μž.

IF l_typecode = 'E'.
ENDIF.

 

처음 λ³΄λŠ” μ‚¬λžŒμ€ 'E'κ°€ 무엇을 μ˜λ―Έν•˜λŠ”μ§€ μ•Œ 수 μ—†λ‹€. 이게 였λ₯˜(Error)의 'E' 인지 μ•„λ‹ˆλ©΄, μ–΄λ– ν•œ λΉ„μ§€λ‹ˆμŠ€ μ½”λ“œ κ°’ 쀑 ν•˜λ‚˜μΈ 'E' ( 예λ₯Ό λ“€μ–΄ μ–Έμ–΄ν‚€ 'EN'의 'E' ) 인지 말이닀. μ΄λ ‡κ²Œ 정체λ₯Ό μ•Œ 수 μ—†λŠ” λ¦¬ν„°λŸ΄ 값을 μ½”λ“œμ— λ°•μ•„λ‘λŠ” κ±Έ 맀직 λ„˜λ²„λΌκ³  λΆ€λ₯Έλ‹€. λ§ˆλ²•μ²˜λŸΌ μ˜λ―Έκ°€ 숨겨져 μžˆμ–΄μ„œ, μ½λŠ” μ‚¬λžŒμ΄ ν•΄μ„ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ΄λ‹€. 이런 경우 μƒμˆ˜λ₯Ό ν™œμš©ν•˜μ—¬ 의미λ₯Ό λΆ€μ—¬ν•΄ 보자.

CONSTANTS c_error TYPE zstatus VALUE 'E'. 

 

이제 'E'κ°€ μ—λŸ¬ μƒνƒœλ₯Ό μ˜λ―Έν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

 

✍️  λ§€μ§ λ„˜λ²„(Magic Number)와 ν•˜λ“œμ½”λ”©(Hard Coding)은 λ‹€λ₯Έ 걸까?

κ²°λ‘ λΆ€ν„° λ§ν•˜μžλ©΄ 맀직 λ„˜λ²„λŠ” ν•˜λ“œμ½”λ”©μ˜ μΌμ’…μ΄μ§€λ§Œ, λͺ¨λ“  ν•˜λ“œμ½”λ”©μ΄ 맀직 λ„˜λ²„λŠ” μ•„λ‹ˆλ‹€.
πŸ“Œ ν•˜λ“œμ½”λ”©(Hard Coding) = κ°’ 직접 μž…λ ₯
      ν•˜λ“œμ½”λ”©μ€ 값을 λ³€μˆ˜λ‚˜ μƒμˆ˜λ‘œ μΆ”μΆœν•˜μ§€ μ•Šκ³  μ½”λ“œμ— 직접 μ¨λ„£λŠ” 것을 말함. (의미λ₯Ό μ•Œ 수 있음)
πŸ“Œλ§€μ§ λ„˜λ²„(Magic Number) = 의미 μ—†λŠ” ν•˜λ“œμ½”λ”©
      ν•˜λ“œμ½”λ”©μ΄μ§€λ§Œ 의미λ₯Ό μ•Œ 수 μ—†μŒ.

2. 같은 ν•­λͺ©μ˜ μƒμˆ˜λ“€λΌλ¦¬ κ·Έλ£Ήν™” ν•˜μ—¬ λ¬Άμ–΄μ„œ μ‚¬μš©ν•˜μž. (Grouping)

❌ Bad Case
CONSTANTS:
   c_success  TYPE sy-msgty VALUE 'S',
   c_error TYPE sy-msgty VALUE 'E',
   c_kr TYPE sy-langu VALUE '3',
   c_en TYPE sy-langu VALUE 'E'.

βœ… Good Case
CONSTANTS:
  BEGIN OF cs_status,
      success  TYPE sy-msgty VALUE 'S',
      error TYPE sy-msgty VALUE 'E',
  END OF cs_status,
  BEGIN OF cs_language,  
     kr TYPE sy-langu VALUE '3',
     en TYPE sy-langu VALUE 'E'.
  END OF cs_language.
  • μ˜λ―Έμ™€ λ§₯락이 λͺ…ν™• : 단일 μƒμˆ˜λŠ” μ΄λ¦„λ§Œ 보고 μš©λ„λ₯Ό μœ μΆ”ν•΄μ•Ό ν•˜μ§€λ§Œ, κ·Έλ£Ή 이름이 λΆ™μœΌλ©΄ 무엇에 λŒ€ν•œ μƒμˆ˜μΈμ§€ λͺ…ν™•ν•˜κ²Œ μ•Œ 수 μžˆλ‹€.
  • 가독성 ν–₯상 : μƒμˆ˜κ°€ κ΄€λ ¨ μ£Όμ œλ³„λ‘œ μ •λ¦¬λ˜μ–΄ 있기 λ•Œλ¬Έμ— μ½”λ“œλ₯Ό μ½λŠ” μ‚¬λžŒμ΄ 전체 μƒμˆ˜ ꡬ쑰λ₯Ό μ‰½κ²Œ 이해할 수 μžˆλ‹€.
  • μž¬μ‚¬μš©μ„±κ³Ό μœ μ§€λ³΄μˆ˜ ν–₯상 : ν•˜λ‚˜μ˜ ꡬ쑰 μ•ˆμ— μ •μ˜ν•΄ 두면, μƒμˆ˜ μΆ”κ°€, μˆ˜μ •, μ‚­μ œ μ‹œ 관리가 쉽고, ꡬ쑰적으둜 μ—°κ²°λ˜μ–΄ μžˆμ–΄ 쀑볡 λ°©μ§€ 및 였λ₯˜ κ°€λŠ₯μ„± κ°μ†Œλœλ‹€.

3. μ—΄κ±°ν˜• 클래슀 (Enumeration Class)λ₯Ό ν™œμš©ν•˜μž.

μƒμˆ˜λ₯Ό λ¬ΆλŠ” 더 μ§„λ³΄λœ 방식이 λ°”λ‘œ μ—΄κ±°ν˜• ν΄λž˜μŠ€μ΄λ‹€. 이 ν΄λž˜μŠ€λŠ” λ‹¨μˆœνžˆ κ°’λ§Œ κ°€μ§€λŠ” 게 μ•„λ‹ˆλΌ, λΉ„κ΅λ‚˜ λ³€ν™˜μ„ μœ„ν•œ λ©”μ„œλ“œλ„ ν•¨κ»˜ 포함할 수 μžˆμ–΄ ν™•μž₯μ„±κΉŒμ§€ κ°–μΆ”μ—ˆλ‹€.

CLASS zcl_example_enum DEFINITION PUBLIC ABSTRACT FINAL.
   PUBLIC SECTION.
      CONSTANTS:
          BEGIN OF category,
             food TYPE c VALUE 'F',
             drink TYPE c VALUE 'D',
          END OF category.

    CLASS-METHODS get_description 
         IMPORTING value TYPE c
         RETURNING VALUE(text) TYPE string.
ENDCLASS.

 

✍️  μ—΄κ±°ν˜• 클래슀(Enumeration Class)λž€?

νŠΉμ •ν•œ κ°’λ“€μ˜ 집합을 미리 μ •μ˜ν•΄ 놓고, 의미 μžˆλŠ” μ΄λ¦„μœΌλ‘œ κ΄€λ¦¬ν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€. 이 ν΄λž˜μŠ€λŠ” μƒμˆ˜(Constant)처럼 값을 μ €μž₯ν•˜μ§€λ§Œ, κ·Έμ € κ°’λ§Œ μ €μž₯ν•˜λŠ” 게 μ•„λ‹ˆλΌ μΆ”κ°€λ‘œ λ©”μ„œλ“œλ„ κ°€μ§ˆ 수 있고, νƒ€μž… μ•ˆμ •μ„±(type safety)도 높일 수 μžˆλ‹€.

βœ… CLASS ... ABSTRACT FINAL둜 μ„ μ–Έ
βœ… CONSTANTS μ•ˆμ— BEGIN OF ... κ΅¬μ‘°λ‘œ λ¬ΆκΈ°
βœ… (μ˜΅μ…˜) CLASS-METHODS둜 λ©”μ„œλ“œ μΆ”κ°€