작게 만들어라

  • if 문 / else 문 / while 문 등에 들어가는 블록은 한 줄이어야 한다
  • 중첩 구조가 생길만큼 함수가 커져서는 안된다
  • 함수에서 들여쓰기는 1~2단을 넘어서지 않는 것이 좋다

 

한 가지만 해라

  • "함수는 한 가지만을, 잘 해야 한다!"
  • 우선 작성한 함수가 몇 가지의 일을 하는지 파악해야 한다
  • 한 함수의 이름 내에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 한다
  • 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다

 

함수 당 추상화 수준은 하나로!

  • 짧으면서도 한 가지만 하는 함수를 만들자
  • 함수를 내려가기 규칙에 따라 작성할 것
  • 코드는 위에서 아래로 이야기처럼 읽는 게 좋다 (함수 추상화 수준이 한 단계씩 낮아짐)

 

Switch 문

  • switch 문은 여러 가지의 일을 처리하기 때문에 길어지기 쉽다 
    -> 다형성을 이용하여 switch 문을 저차원 클래스에 숨기고 반복하지 않는 방법을 사용하자

 

서술적인 이름을 사용해라

  • 예) testableHTML -> setupTeardownIncluder.render
  • 이름을 짓는 데 시간이 걸려도 괜찮고, 이름이 길어져도 괜찮다
  • 서술적인 이름은 머릿속에 뚜렷한 그림을 그리게 해주기 때문에, 코드의 개선 또한 쉽다
  • 모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용해야 한다

 

함수 인수

  • 함수에서 이상적인 인수의 개수는 0개(무항)~1개이다.
  • 인수가 3개 이상이 되지 않도록 하자
  • 1개 이상의 인수를 사용하는 상황
    1) 인수에 질문을 던지는 경우
    2) 인수를 변환해 결과를 반환하는 경우

 

부수 효과를 일으키지 마라

  • 함수에서 한 가지만 하겠다고 하고 다른 일을 더 하게 하지 말자
  • 특히 부수 효과가 숨겨진 경우에는 큰 혼란을 초래할 수 있다
  • 일단 출력 인수는 피하되, 함수의 상태를 바꿔야 한다면 함수가 속한 객체의 상태를 변경할 것

 

명령과 조회를 분리해라

  • 함수는 뭔가를 수행하거나 뭔가에 답하는 것 중 하나만 해야 한다
  • 명령 함수에서 오류 코드를 반환하면 명령/조회 분리 규칙을 위반할 수 있다
    -> 오류 코드보다는 예외를 사용할 것
    -> try / catch 블록은 별도의 함수로 분리하자
    -> 오류를 처리하는 함수도 한 가지 작업(오류 처리)만 해야 한다 + 중복은 최대한 제거하자

 

구조적 프로그래밍

  • 구조적 프로그래밍 원칙: 모든 함수와 그 안의 모든 블록에 입구와 출구가 하나만 존재해야 한다
    -> 함수는 return 문이 하나여야 한다
    -> 루프 안에서 break 나 continue 를 사용해서는 안된다
    -> goto 는 절대 사용하지 않아야 한다
  • 위와 같은 원칙은 함수가 아주 클 때만 유리하다
    -> 함수가 작다면 return, break, continue 를 사용해도 된다
    -> goto 문은 작은 함수에서는 피하자

 

함수를 어떻게 짜죠?

  • 소프트웨어를 짜는 것은 글짓기와 비슷하다
  • 먼저 생각을 기록한 후 점차 다듬어나간다