본문 바로가기

Book/Clean Code

[클린 코드] Assignment #04: TIL - 3장. 함수

728x90

 

📢 DAY 4~5
🏷️ 오늘 읽은 범위: 3장. 함수

🖊️ 짧은 내용 요약

  • 함수는 작게 만드는 게 좋다.
    블록에 들어가는 줄은 함수를 호출하는 코드로 작성해 최대한 1~2 줄로 작성한다.
  • 함수는 무조건 한 가지 일만 하도록 만든다.
    한 가지 일은 한다는 뜻은 추상화 수준이 하나인 단계만 수행한다는 뜻이다. 쉽게 설명하면 함수 내부의 코드를 다른 함수로 계속 쪼개서 쪼개지 못할 때까지 나누는 거다. 대신 함수 내부의 코드는 추상화 수준이 동일하게 만든다. 추상화 수준을 동일하게 만드는 것은 어렵지만 구현할 기능을 단계별로 작성해본 뒤 단계가 내려갈수록 추상화 수준을 한 단계씩 낮추면 추상화 수준을 일관되게 만들 수 있다.
  • 함수의 이름은 길어도 괜찮으니 서술적인 이름이 좋다.
    이름은 최대한 일관성 있게 짓는다. 인수가 여러 개인 함수라면 함수 이름에 인수 이름을 순서대로 넣어 넣어야 하는 인수를 기억하지 않도록 만들 수도 있다.
  • 함수에서 이상적인 인수의 개수는 0개고, 차선은 1개이다.
    1개의 인수를 사용할 때는 아래의 예시처럼 만든다.

    // 인수에 질문을 던지기
    boolean fileExists('myFile')
    
    // 인수를 변환해 결과로 반환하기
    InputStream fileOpen('myFile')
    
    // 이벤트 함수(이벤트 함수임을 이름에서 명확히 나타낼 것)
    passwordAttemptFailedNtimes(int attempts)

    이항 함수는 좌표처럼 당연하게 2개의 인자가 사용되는 게 아니라면 최대한 단항 함수로 바꾸는 게 좋다. 또한, 인수를 받아서 같은 형식으로 출력하는 인수는 개발할 때 혼란을 줄 수 있다. 이럴 경우에는 함수가 속한 객체 상태를 변경하는 방식으로 만든다.
  • 오류 코드보다는 예외 처리를 사용한다.
    하지만 이 예외 처리도 별도의 함수로 뽑아내는 게 좋다.
  • 함수를 처음부터 잘 만드는 것은 어렵다. 코드를 다 작성한 다음에 쪼개서 다듬으면 된다.

😀 책에서 기억하고 싶은 내용

내가 함수를 짤 때도 마찬가지다. 처음에는 길고 복잡하다.
들여쓰기 단계도 많고 중복된 루프도 많다.
인수 목록도 아주 길다. 이름은 즉흥적이고 코드는 중복된다.
하지만 나는 그 서투른 코드를 빠짐없이 테스트하는 단위 테스트 케이스도 만든다. (p. 61)
더보기
함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다. (p. 44)
함수가 '한 가지'만 하는지 판단하는 방법이 하나 더 있다. 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다. (p. 45)
함수가 확실히 '한 가지' 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다. (p. 45)
길고 서술적인 이름이 짧고 어려운 이름보다 좋다. 길고 서술적인 이름이 길고 서술적인 주석보다 좋다. (p. 49)
서술적인 이름을 사용하면 개발자 머릿속에서도 설계가 뚜렷해지므로 코드를 개선하기 쉬워진다. (p. 49)
try/catch 블록은 원래 추하다. 코드 구조에 혼란을 일으키며, 정상 동작과 오류 처리 동작을 뒤섞는다. 그러므로 try/catch 블록을 별도 함수로 뽑아내는 편이 좋다. (p. 58)
내가 함수를 짤 때도 마찬가지다. 처음에는 길고 복잡하다. 들여쓰기 단계도 많고 중복된 루프도 많다. 인수 목록도 아주 길다. 이름은 즉흥적이고 코드는 중복된다. 하지만 나는 그 서투른 코드를 빠짐없이 테스트하는 단위 테스트 케이스도 만든다. (p. 61)
대가 프로그래머는 시스템을 (구현할) 프로그램이 아니라 (풀어갈) 이야기로 여긴다. (p. 62)

🤔 오늘 읽은 소감 & 떠오르는 생각

함수의 인자가 코드가 복잡해지는데 영향을 줄 수 있다는 생각을 해본 적이 없는데 인자가 적을수록 좋다는 사실을 처음 알게 되었다. 또, 함수 안의 문장들의 추상화 수준이 동일한지 판단하는 게 어려웠는데, 확인할 수 있는 방법을 예시를 들어서 설명해 주어서 좋았다. 그리고 함수 이름이 너무 길어지면 간결해 보이지 않아 걱정된 적도 많았는데 오히려 서술적인 이름이 좋다는 사실도 알게 되었다.  

🔍 새로 알았거나 잘 이해되지 않는 내용

  • Enclosing function
    중첩 함수를 가지고 있는 함수
  • 출력 인수
    함수의 인수로 받은 객체가 함수를 거쳐 똑같은 객체로 출력되는 경우에 해당하는 함수의 인수
  • 구조적 프로그래밍
    절차적 프로그래밍 방법이라고도 하며, 코드가 위에서 아래의 방향으로만 진행되는 방식

📚 참고

반응형