프로젝트 경험기/리팩토링 경험기

[리팩토링] 가독성 높이기 - 함수명 개선

yubi5050 2023. 8. 5. 18:37

배경

몇달간의 프로젝트를 진행 후에,

서로 다른 코드 스타일, 모듈들의 역할에 대해 상이하게 생각한 부분 등의 문제점들이 발견되었고,

2주 간의 리팩토링을 진행하는 시간을 가지게 되었다.

 

다음 글에서는 리팩토링을 진행 하면서, '가독성 높이기 - 함수명 개선' 에 대한 경험을 공유 하려 한다.

 

가장 큰 목적은 여럿이서 작성한 다양한 함수명 틀을, 조금이나마 비슷하게 맞춰 가독성을 높이는데 중점을 두었다.

 

함수명 개선 간 나름 정한 규칙은 다음과 같다

- Service Class 명도 해당 함수에 같이 의미 해석 된다.

- check, validate, in 등의 비슷한 결의 함수명을 가지게 함

 

사례 1 - 함수명 개선 하기

👉 변경 전 코드

## 변경 전 코드
# main.py
UserService.update_user_in_mypage():

# service.py
class UserService:
   @staticmethod
   def update_user_in_mypage():
      pass

 

👉 변경 후 코드

## 변경 후 코드
# main.py
UserService.update_in_mypage():

# service.py
class UserService:
   @staticmethod
   def update_in_mypage():
      pass

 

👉 문제점

  • 함수만 놓고 읽을 땐, update_user_in_mypage 라는 말이 자연스럽게 읽힐 수 있다.
  • 하지만 main에서 UserService (클래스명)이 같이 붙기 때문에, 사실 user라는 워딩이 중복되어 사용된다. 
  • 따라서 해당 함수는 user를 제거해, 가독성을 높일 수 있다.
  • 핵심은 소속된 상위 객체명이나, 선언시 같이 쓰이는 워딩을 전체적으로 봐서 함수명을 개선하자.

 

사례 2 - 공통 된 함수 포맷을 정의하자

👉 설명

  • 해당 주제는 코드를 보면서 기능적으로 비슷한 역할을 하는 함수들끼리는 모아서 공통된 포맷을 정의하자 이다.

 

👉 check_ , validate_  중 어느 것을 써야 할까?

  • 사실 많은 코드 들에서, check_ 와 validate_ 는 확인이나 검증이 필요한 로직에서 둘 중에 한쪽으로 선택되어 쓰이기도 하는데, 해당 프로젝트에서는 확인, 검증을 필요로 하는 경우가 다양하게 존재했고, 굉장히 많았다.
  • ex) 값에 대한 최소값, 최댓값 검증
  • ex) 값이 특정 상황(상태)에서 정상적인 값인지
  • 따라서 굳이 한쪽으로 통일 할 필요 없이 둘에 대한 함수 구분을 나눠 보는 것도 좋다고 여겨졌다. (가독성을 위해)

 

👉 check_ , validate_  구분 기준

  • validate_<obj> : 데이터 검증, id 값 검증 등 기타 값 중심적인 검증
  • check_<obj> : 상황, 상태에 대한 조건 확인, 권한 체크 등

 

👉 적용 된 코드

# router.py

@router('/api/v1/article/')
def update_article(article_id: int):
   # 유저의 Article 수정에 대한 권한 검증
   ArticleService.check_user_has_permission()

   # Article 제목 값 검증
   ArticleService.validate_title()

# service.py
class ArticleService:
   @staticmethod
   def check_user_has_permission():
      pass
      
   @staticmethod
   def validate_title():
      pass

 

 

👉 결론

  • check_user_has_permission 로 수정에 대한 (상황) 확인 
  • validate_title 로 제목 값에 대한 검증 확인