Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- is_ajax() not working
- HTTP
- check ajax
- Djnago CSRF
- Django Ajax
- 복수 외래키
- queryset
- 클린코드-함수
- CleanCode
- 효울적
- 합치기
- Clean Code
- django 시작하기
- 글자 수
- Trre heap
- 트리란
- render html
- request.path
- 클린 코드
- Proxy_pass
- 조회수 조작
- request.GET
- django
- 클린코드
- 포맷팅
- nginx
- queryset filter
- Filtering
- reCAPTCHA V2
- 자료구조
Archives
- Today
- Total
Yang 코딩 공부
클린 코드 - 함수 본문
1.함수의 역할은 하나만 할 수 있도록 하자 (SRP)
함수의 역할이 많아지면 오류가 날 가능성이 커지고 가독성이 떨어진다.
또한 어느 부분에서 오류가 나는지 파악하기 힘들어지고 함수에 대한 테스트를 진행하기 어려워진다.
따라서 함수는 하나의 역할만 하게 하는게 좋다.
# 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.반복하지 말자 (DRY)
관심사를 잘 분리하고 의존성을 줄이기 위해 반복되는 코드를 하나의 함수로 만들어 사용하자.
ex) 검증하는 코드 등
# 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.사이드 이펙트를 잘 핸들링 하자.
: 사이드 이펙트란 함수가 실행됐을 때 함수 이외의 어떤 것들에 변화를 주는 것을 뜻합니다.
사이드 이펙트를 잘 다루지 못하면 예측하지 못하는 문제가 발생할 수 있다.
ex) DB내용 변경으로 선 후 결과가 꼬인 경우
#사이드 이펙트가 없습니다.
def get_user_instance(email, password):
user = User(email, password)
return user
#사이드 이펙트가 있습니다
def update_user_instance(user):
user.email = "new email" #인자로 받은 user 객체를 업데이트합니다.
...
#사이드 이펙트가 있습니다
def create_user(email, password):
user = User(email, password)
start_db_session() #외부의 DB Session에 변화를 줄 수 있습니다.
...
- 핸들링 하는 방법
- 코드를 통해 충분히 예측할 수 있도록 네이밍에 주의할 것.
- update, set 같은 직관적인 prefix를 붙여서 사이트 이펙트가 있을 수 있음을 암시
- 함수의 사이드 이펙트가 잇는 부분과 없는 부분을 나눠 관리 할 것
- 명령(side effect O)과 조회(side effect X)를 분리하는 CORS 방식이 있다.
- 일반적으로 update를 남발하기 보단 순수 함수 형태로 사용하는 것이 더 직관적이고 에러를 방지 할 수 있다
- 코드를 통해 충분히 예측할 수 있도록 네이밍에 주의할 것.
# as-is
carts = []
#사이드 이펙트를 발생시킴
def add_cart(product):
carts.append(product)
product = Product(...)
add_cart(product)
#add_cart함수가 작동중에 carts 리스트를 불러올 경우 사이드 이펙트 발생
# to-be
carts = []
#사이드 이펙트가 없는 순수함수
def get_added_cart(product):
return [...carts, prodcut]
product = Product(...)
carts = get_added_cart(product)
'Coding Study > Clean Code' 카테고리의 다른 글
클린 코드 - 주석, 포맷팅 (0) | 2022.12.30 |
---|---|
클린 코드 - 네이밍 (0) | 2022.09.19 |