클린 코드: 함수
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를 붙인다.
- 함수를 사이드 이펙트가 있는 부분과 없는 부분으로 나눠서 관리한다.
- 일반적으로 순수 함수 형태로 사용하는 것이 직관적이고, 에러를 방지 할 수 있다.
- 코드를 통해 예측 할 수 있도록 네이밍을 한다.
<참고>
'# Development > Methodologies' 카테고리의 다른 글
[클린 코드] 에러 핸들링 (0) | 2023.01.31 |
---|---|
[클린 코드] 클래스 (0) | 2023.01.31 |
[클린 코드] 주석 & 포맷팅 (0) | 2023.01.31 |
[클린 코드] 네이밍 (0) | 2023.01.11 |