코딩하는 털보

클린 코드, 3. 함수 본문

Book/클린 코드

클린 코드, 3. 함수

이정인 2021. 8. 25. 13:26

클린 코드, 3. 함수

함수를 잘 만드는 법!

  • 작게 만들어라.
    조건문/반복문에 들어가는 블록을 한줄로 줄인다. 보통 다른 함수를 호출한다.
  • 한 가지만 해라.
    함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다.
    여기에서 한 가지 작업이란 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행하는 것이다.
    만약 의미 있는 이름으로 다른 함수로 추출할 수 있다면 그 함수는 여러 작업을 하고 있는 것이다.
  • 함수 당 추상화 수준은 하나로.
    TO 문단을 읽어내려 가듯이 코드를 구현하여 각 함수가 일정한 추상화 수준을 유지하면서 다음 함수를 참고하고 소개하도록 한다.
  • Switch 문
    switch 문은 작게 만들거나 한 가지 작업만 하게 만들기 어렵다. 그러므로 switch 문을 추상 팩토리에 담아서 다형성을 통해 다른 코드에서 같은 switch 문이 발생하지 않고 switch 문을 숨길 수 있도록 할 수 있다.
  • 서술적인 이름을 사용하라.
    길고 서술적인 이름이 짧고 어려운 이름보다 좋으니 여러 단어를 사용하여 함수의 기능을 잘 표현하는 이름을 선택하자.
    서술적인 이름을 사용하면 설계가 뚜렷해지므로 코드를 개선하기 쉬워진다.
  • 함수 인수
    최선은 함수 인수가 없는 경우이며, 차선은 1개, 늘어날 수록 좋지 않다. 함수 인수로 사용하는 것 대신 클래스의 인스턴스 변수로 선언하여 사용하자.
    • 많이 쓰는 단항 형식
      인수에 질문을 던지는 함수, 인수를 변환하여 결과를 반환하는 함수, 입력 인수로 시스템 상태를 바꾸는 이벤트 함수 세가지 경우가 아닌 함수는 단항 함수를 피한다.
    • 플래그 인수는 피한다. ex) render(true)
    • 이항 함수
      이항 함수는 단항 함수보다 이해하기 어렵다. 가능하면 단항 함수로 바꾸도록 애써야한다.
    • 인수 객체
      인수가 2-3개 필요하다면 일부를 독자적인 클래스 변수로 선언해보는 것을 고려한다.
      Circle makeCircle(double x, double y, double radius); ====>
      Circle makeCircle(Point center, double radius);
    • 동사와 키워드
      단항 함수는 함수와 인수가 동사/명사 쌍을 이뤄야 한다. ex) writeField(name)
      함수 이름에 키워드를 추가할 수도 있다. ex) assertExpectedEqualsActual(expected, actual)
    • 출력 인수
      출력 인수 쓰지말고 클래스 변수를 this로 변경하는 방식을 사용하자.
  • 부수 효과를 일으키지 마라.
    메서드의 이름으로는 확인되지 않는 부수 효과를 숨기고 있으면 안된다.
  • 명령과 조회를 분리하라.
    객체 상태를 변경하거나 객체 정보를 반환하거나 둘 중 하나만 해야 한다. 둘다 하면 혼란스럽다.
  • 오류 코드보다 예외를 사용하라.
    오류 코드를 사용하면 조건문이 여러 단계로 중첩될 수 있고 오류 처리 코드까지 같이 작성해야 한다.
    오류 코드 대신 예외를 사용하면 오류 처리 코드를 원래 코드에서 분리할 수 있다.
    try/catch 블록은 코드 구조를 혼란스럽게 하므로 별도의 함수로 뽑아내는 편이 좋다.
  • 반복하지 마라.
  • 구조적 프로그래밍
    함수가 아주 크다면 되도록 단일 입/출구 규칙을 지킨다. (break, continue, goto를 사용하지 않고 return 문은 한번만 있어야 한다.)
  • 함수 짜기
    처음부터 위의 규칙에 맞춰 짜는 것은 쉽지 않다. 리펙터링이 중요하다.
Comments