Programming/📚 Book Study

[Clean Code] 3. 함수 (함수 작성 규칙)

남남이루 2023. 5. 9. 15:28
작성일 2023. 1. 23
범위 Clean Code 도서, Chaper 3. 함수

 

 

[Clean Code] 3. 함수

함수를 만드는 규칙들

1. 작게 만들어라

함수는 작을 수록 좋다. (중첩 구조 X, 들여쓰기 수준은 2개 이하)

2. 한 가지만 해라

함수가 여러 일을 할 수록 이해하기 어려워진다.

3. 함수당 추상화 수준은 하나로

4. 서술적인 이름을 사용하라

함수의 이름은 함수의 일을 잘 표현하는 이름일 수록 좋다.

5. 이상적인 인수의 개수 : 0개

인수가 많아질 수록 읽는 사람에게 혼동을 준다. 따라서 인수는 적을 수록 좋다, 0개에서 1개를 유지하라.

6. 부수 효과를 일으키지 마라

7. 명령과 조회를 분리하라

함수는 뭔가를 수행하거나 답하는 하나의 일만 해야한다.

8. 오류코드보다 예외처리하라

  • return error ⇒ return logger.log(e.getMessage())
  • try catch ⇒ 정상 동작과 오류 처리를 섞기 때문에, 함수에서 try catch를 별도로 분리해 상위함수가 모든 오류를 처리할 수 있도록 해야한다.
  • 함수가 한 가지 작업만 해야 하는데, 오류처리도 한 가지 작업에 해당한다. 따라서 오류처리하는 함수는 오류만 처리해야 한다.

9. 반복하지 마라!

10. 구조적 프로그래밍

함수가 길 때, 함수에 return문이 하나여야 하고, 반복문 중간에 break나 continue가 사용될 수 없다는 데이크스트라의 구조적 프로그래밍 원칙은 유효하다. 하지만,

11. 처음부터 완벽한 함수를 짜지 않는다.

처음에는 길고 복잡한 함수를 만들더라도, 코드를 다듬고 중복을 제거하고 리팩토링 한다. 동시에 계속해서 단위테스트를 통과하게 만든다. 최종적으로 위의 규칙을 따르는 함수가 얻어진다.

배운 점

  1. 오늘도, 프로그래밍은 이야기로써 읽는 사람들을 고려하는 것이 기본 원칙이라는 것이 핵심이다.
  2. 함수 파트를 읽으면서, 그동안 지양하고 싶었던 버릇들을 보다 엄격하게 다뤄야 한다는 것을 알게되었다. 타협 X !
  3. 이야기를 쓸 때 문장을 쪼개고 주제를 쪼개는 것처럼, 프로그래밍도 동일하다.
  4. 고차 함수가 위 규칙을 잘 따르고 있기 때문에 잘 사용해야 한다고 배웠던 게 기억이 났다.

스터디 리뷰

  • JAS 님의 clean-code-javascript 레포, JAVA 코드보면서 넘어갔었는데, 더 잘 이해된다고 하니 나도 봐야겠다.
  • JAS님, 예시 코드를 함께 필기해둔 거 좋구나! 필기해둔 거만 보면 클린코드 책을 다시 펼치지 않아도 되게끔.

실습

소인수 분해하기 문제

def solution(n):
    **yacks** = set()
    **sosu** = set()

    def updateYacksu(n):
        for i in range(1,int(n**0.5) +1):
            res, mok = n%i, n//i
            if res == 0:
                yacks.add(mok)
                yacks.add(i)

    def getYackCnt(n):
        **local_yacks** = set()
        for i in range(1,int(n**0.5) +1):
            res, mok = n%i, n//i
            if res == 0:
                local_yacks.add(mok)
                local_yacks.add(i)
        return len(local_yacks)

    def updateSosu():
        for num in yacks:
            if getYackCnt(num) == 2:
                sosu.add(num)

    updateYacksu(n)
    updateSosu()

    return sorted(list(sosu))
  • 연습
    • 들여쓰기 깊이 2 이하
      함수 쪼개기
      내부에서만 사용되는 변수를 사용해 함수의 순수성 유지
      함수 하나당 하나의 역할
      인수의 개수 최소화
      함수명을 일관적으로 작성
      동사로 함수명을 표현

https://school.programmers.co.kr/learn/courses/30/lessons/120852