[클린 코드 읽고 정리해두고 다시 보기] 함수

inho ha·2024년 9월 12일
0

작게 만들어라

  • 함수는 작게, 더 작게 만들어라, 작을수록 더 좋다.
  • if / else / while 에는 한 줄만 들어가고, 거기서 함수를 호출하라

한 가지만 해라!

  • 여러 작업을 하는 함수는 분리
  • 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 여러 작업을 하는 함수이니까 분리하라

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

  • 함수 내 모든 문장의 추상화 수준이 동일해야 한다.
  • getHtml() 은 추상화 수준 높음
  • PathParser.render(pagepath) 는 추상화 수준 중간
  • .append("\n") 은 추상화 수준 낮음

Switch 문

  • switch 문은 추상 팩토리에 숨기고, 팩토리는 switch 문을 사용해 적절한 파생 클래스의 인스턴스를 생성하라

서술적인 이름을 사용하라

  • 여러 단어가 쉽게 읽히는 명명법을 사용하고, 여러 단어를 사용해 함수 기능을 잘 표현하는 이름을 선택한다.
  • 모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용한다. (일관성)

함수 인수

  • 인수는 적을 수록 좋다. 3개 이상은 피하고, 4개 이상은 금지
  • 인수가 적으면 테스트 코드 작성도 편하다.
  • 출력 인수는 피하고, 반환값으로 출력하라
  • 이벤트 함수는 이벤트라는 사실이 코드에 명확히 드러나야 한다.
  • 인수에 질문을 던지거나, 인수를 변환해 결과를 반환하는 경우에만 인수 1개 사용
  • 플래그 인수 금지
  • 인수가 2개인 경우는 인수 하나의 클래스 메서드로 변경하여 단항으로 변경
  • 인수가 많은 경우에 일부를 클래스로 묶어라
  • 인수를 설명하는 키워드를 포함한 이름 사용
  • write(name) -> writeField(name)

부수 효과를 일으키지 마라

  • 인수나 시스템 전역 변수를 수정하는 부수 효과는 함수에서 한 가지 이상의 일을 하게 만든다.
  • 이는 temporal coupling, order dependency 를 초래한다.
  • temporal coupling이 필요하다면 이것이 함수의 이름에서 파악가능 하도록 해야한다.
  • 출력 인수를 피하고, 함수가 속한 객체 상태를 변경하는 방식을 택한다.

명령과 조회를 분리하라

  • 함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야한다.
  • 객체 상태를 변경하거나 아니면 객체 정보를 반환하거나 둘 중 하나다.
  • set 함수에서 성공 여부를 boolean 으로 반환하면 if(set(attr, value)) 으로 사용되고, 이는 기존 attr이 value값으로 설정 되어 있다면 으로 읽힌다.

오류 코드보다 예외를 사용하라

  • 명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 위반한다.
  • 오류 코드를 반환하면 이를 곧바로 처리해야하기 때문에 여러 단계로 중첩되는 코드를 야기한다.
  • try/catch 블록은 별도 오류 처리 함수로 뽑아낸다.
  • 오류 처리 함수도 오류 처리라는 한 가지 작업만 해야 한다.

반복하지 마라

  • 중복된 코드가 있다면 알고리즘이 변할 때 수정할 대상이 많고, 누락으로 오류가 발생할 확률이 높아진다.

구조적 프로그래밍

  • 구조적 프로그래밍은 return은 한개만 break, continue는 사용 금지라고 말하는데 이는 좋지 않다.
  • 함수를 작게 만들면 return, break, continue를 여러 차례 사용해도 좋다.

함수를 어떻게 짜죠?

  • 일단 동작하도록 작성하고, 테스트 코드를 작성한다.
  • 이후 코드를 다듬고, 함수를 만들고, 이름을 바꾸고, 중복을 제거하고, 메서드를 줄이고, 순서를 바꾸고, 전체 클래스를 쪼개고... 항상 테스트 코드가 통과하는 것을 확인하면서 리팩토링한다.
profile
inho ha / ian(swatchon) / iha(42seoul)

0개의 댓글