Clean Code: 함수

jiffydev·2021년 5월 27일
0

Clean Code

목록 보기
2/13

모든 코드의 기초인 함수를 잘 만드는 방법

1. 작게, 더 작게

각 함수는 하나의 이야기만을 표현해야 한다.

  • 블록과 들여쓰기
    if/else, while문 안에 들어가는 블록은 한 줄이어야 한다. 그 블록 안에서 함수를 호출한다.
    함수에서 들여쓰기 수준은 최대 2단까지이다.

  • 한 가지 일만
    같은 추상화 수준에서 하는 일이라면 한 가지 일이다. 따라서 추상화 수준이 다른 작업은 함수를 분리한다.
    의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러가지 작업을 하는 것이다.

2. 서술적인 이름

함수가 작고 단순할수록 서술적인 이름을 고르기가 쉬워진다.
이름이 길더라도 서술적인 것이 좋다.
모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용하여 일관성있게 짓는다.

# 예
includeSetupAndTeardownPages()
includeSetupPages()
includeSuiteSetupPages()
includeSetupPage()

3. 함수의 인수

인수의 개수는 적을수록 좋다.
테스트 관점에서도 인수가 늘어날수록 구성해야 할 조합이 늘어나 테스트가 부담된다.

  • 단항 함수
    단항 함수를 사용하는 경우는 두 가지가 있다.
    1. 인수에 질문을 던지는 경우
      boolean fileExists("MyFile")
    2. 인수를 변환해 결과를 반환하는 경우
      InputStream fileOpen("MyFile")

예외적으로 이벤트 함수는 단항 함수로 사용 가능하다.
그 외에는 단항 함수를 쓸 이유가 없다.

  • 플래그 함수
    사용하지 않는 것이 좋다.
    인수로 boolean을 넘기는 시점에서 이미 함수가 두 가지 일을 한다고 선언한 것과 마찬가지이기 때문이다.

  • 이항, 삼항 함수
    불가피하게 이항, 삼항 함수를 만들어야 하는 경우가 아니라면 단항 함수로 바꾸도록 노력해야 한다.

  • 인수 객체
    인수가 2,3개 필요하다면 일부를 독자적인 클래스 변수로 선언하는 것도 고려해 본다.
    변수로 묶게 되면 이름을 붙여야 하므로 결국 개념을 표현하는 것이기 때문.

Circle makeCircle(double x, double y, double radius)
Circle makeCircle(Pointer center, double radius)
  • 동사와 키워드
    단항 함수는 함수와 인수가 동사/명사의 쌍을 이루도록 한다.
    writeField(name)과 같이.
    또는 함수 이름에 인수 이름을 넣을 수도 있다.

4. 부수 효과

한 가지 일만 해야 하는 함수가 은근슬쩍 다른 일도 하게 되는 것이 부수 효과.
부수 효과가 일어나면 시간적 결합, 순서 종속성을 초래하고 혼란을 일으킨다.
따라서 불가피하게 부수 효과가 필요하다면 함수 이름에 이를 명시한다.

5. 명령과 조회의 분리

함수는 무언가를 수행하거나(명령) 무언가에 답하거나(조회) 둘 중 하나만 해야 한다.

public boolean set(String attribute, String value)

if set("username", "unclebob"))...

이름이 attribute인 속성을 찾아 값을 value로 설정 후 성공하면 true, 실패하면 false를 반환하는 함수이다.
함수만 놓고 보면 명령처럼 느껴진다. 하지만 if와 함께 사용하면 조회처럼 느껴지는 애매한 함수이다.
따라서 명령과 조회를 다음과 같이 분명하게 분리한다.

if (attributeExists("username")) {
    setAttribute("username", "unclebob");
    ...
}

6. 함수 짜는 법

한 번에 좋은 함수를 만드는 것을 불가능에 가깝다.
전문가라도 처음에는 지저분한 함수에서 시작한다.
하지만 전문가는 그런 함수도 빠짐없이 테스트하는 unit test를 만들고, 함수를 수정하면서도 테스트는 반드시 통과하도록 만든다.

profile
잘 & 열심히 살고싶은 개발자

0개의 댓글