본문 바로가기

# Development/Methodologies

[클린 코드] 함수

클린 코드: 함수

1. 하나의 역할만 수행한다. (Single Responsibility Principle)

함수의 역할이 많아지면 안좋은점

  • 가독성이 떨어진다.
  • 오류가 생길 가능성이 커진다.
  • 함수에 대한 테스트를 진행하기 어려워진다.
### as-is
def create_user(email, password):
    # validation 로직
    if "@" not in email or len(password) < 6 :
        raise Exception("유저 정보를 제대로 입력하세요")

    user = {"email" : email, "password" : password}

    database = Database("mysql")
    database.add(user)

    email_client = EmailClient()
    email_client.set_config(...)
    email_client.send(email, "회원가입을 축하합니다")

    return True
### to-be
def create_user(email, password):
validate_create_user(email, password)

user = build_user(email, password)

save_user(user)
send_email(email)
return

def validate_create_user(email, password):
    if "@" not in email or len(password) < 6 :
        raise Exception("유저 정보를 제대로 입력하세요")

def build_user(email, password):
    return {
        "email": email,
        "password": password
    }

def save_user(user):
    database = Database("mysql")
    database.add(user)

def send_email(email):
    email_client = EmailClient()
    email_client.set_config(...)
    email_client.send(email, "회원가입을 축하합니다")

2. 반복하지 않는다. (Don't Repeat Yourself)
의존성을 줄이기 위해 반복되는 코드는 하나의 함수로 만들어서 사용한다.

### as-is
def create_user(email, password):
    # validation 로직
    if "@" not in email or len(password) < 6 :
        raise Exception("유저 정보를 제대로 입력하세요")

    ...

def update_user(email, password):
    # validation 로직
    if "@" not in email or len(password) < 6 :
        raise Exception("유저 정보를 제대로 입력하세요")
 ### to-be
 def validate_create_user(email, password):
    if "@" not in email or len(password) < 6 :
        raise Exception("유저 정보를 제대로 입력하세요")

def create_user(email, password):
    validate_create_user(email, password)
    ...

def update_user(email, password):
    validate_create_user(email, password)
    ...

3. 파라미터 수는 적게 유지한다.

### as-is
def save_user(user_name, email, password, created_at):
    ...

### to-be
# 여러 변수를 넘겨줘야 할 때는 클래스를 사용한다.
def save_user(user:User):
    ...

4.사이드 이펙트에 유의한다.

  • 사이드 이펙트
    • 함수가 실행 되었을 때 함수 이외에 변화를 주는 것
    • 예측하지 못한 문제들이 발생할 수 있음
  • 사이드 이펙트 핸들링
    • 코드를 통해 예측 할 수 있도록 네이밍을 한다.
      • update, set 같은 직관적인 prefix를 붙인다.
    • 함수를 사이드 이펙트가 있는 부분과 없는 부분으로 나눠서 관리한다.
    • 일반적으로 순수 함수 형태로 사용하는 것이 직관적이고, 에러를 방지 할 수 있다.

 

<참고>

  1. https://yansfil.github.io/awesome-class-materials/
  2. https://dojang.io/mod/page/view.php?id=2389

'# Development > Methodologies' 카테고리의 다른 글

[클린 코드] 에러 핸들링  (0) 2023.01.31
[클린 코드] 클래스  (0) 2023.01.31
[클린 코드] 주석 & 포맷팅  (0) 2023.01.31
[클린 코드] 네이밍  (0) 2023.01.11