본문 바로가기

Book

Clean Code | 3장 함수

@Clean Code | 함수

 

 

-작게 만들어라

  • 몇 줄 정도로 만들기

 

 

-블록과 들여쓰기

  • if문/ else문/ whille문 등에 들어가는 블록은 한 줄이어야 함
  • 중첩 구조가 생길만큼 함수가 커져서는 안 됨

 

 

-한 가지만 해라

  • "함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다."
  • 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 하는 것
  • 판단법: 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈

 

 

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

  • 함수가 확실히 한 가지 일만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 함
  • 한 함수 내에 추상화 수준을 섞으면 코드 읽는 사람이 헷갈림
  • 근본 개념인지 세부 사항인지 구분 어려워 뒤섞일 수 있음

 

 

-switch문

  • switch문은 본질적으로 N가지 일을 처리하기 때문에 '한 가지' 작업만 하는 switch문을 만들기는 어려움
  • 다형성을 이용해 각 switch문을 저차원 클래스에 숨기고 절대 반복하지 않는 방법은 있음(실제 파생 클래스의 함수가 실행됨)

 

 

-서술적인 이름을 사용하라

  • 여러 단어가 쉽게 읽히는 명명법 사용 -> 여러 단어 사용해 함수 기능을 잘 표현하는 이름 선택
  • 이름 붙일 때는 '일관성'이 있어야 함 -> 모듈 내에서 함수 이름은 같은 문구, 명사, 동사 사용

 

 

-함수 인수

  • 함수에서 이상적인 인수 개수는 0개(무항), 차선은 입력 인수가 1개뿐인 경우
  • 인수는 독자가 허둥지둥 코드를 재차 확인하게 만듬
  • 출력 인수는 입력 인수보다 이해하기 어려움

 

 

-많이 쓰는 단항 형식

  • 인수에 질문을 던지는 경우
  • 인수를 뭔가로 변환해 결과를 반환하는 경우
  • 이벤트

 위 경우가 아니라면 단항 함수는 가급적 피하는 게 좋음

 변환 함수에서 출력 인수를 사용하면 혼란을 일으킴 -> 입력 인수를 변환하는 함수라면 변환 결과는 반환값으로 돌려주는 게 좋음

 

 

 

-플래그 인수

  • 함수로 부울 값을 넘기는 관례는 끔찍함(함수가 한 번에 여러 가지를 처리한다고 공표하는 셈)

 

 

-이항 함수, 삼항 함수

  • 인수가 2개인 함수는 인수가 1개인 함수보다 이해하기 어려움
  • 잠시 주춤하며 첫 인수를 무시해야 한다는 사실을 깨닫을 때가 있는데, 무시한 코드에 오류가 숨어들 수 있으므로 주의해야 함
  • 이항 함수가 적절한 경우는 직교좌표계 점 같은 경우
  • 이항 함수가 무조건 나쁜 건 아님 -> 불가피한 경우도 있음. 그만큼 위험이 따른다는 사실을 이해하고 가능하면 단항 함수로 바꾸도록 해야 함
  • 삼항 함수는 순서, 주춤, 무시로 야기되는 문제가 더욱 늘어남 -> 신중히 고려해야 함

 

 

-동사와 키워드

  • 단항 함수는 함수와 인수자 동사/ 명사 쌍을 이뤄야 함
  • 키워드 추가 -> 함수 이름에 인수 이름을 넣으면 인수 순서를 기억할 필요가 없어짐

 

 

-부수 효과 일으키지 마라

  • 한 가지 일을 하겠다고 하고선 다른 일까지 하지 말기 -> 때로는 예상치 못하게 클래스 변수를 수정하거나, 함수로 넘어온 인수나 시스템 전역 변수를 수정할 수도 있음 주의

 

 

-출력 인수

  • 일반적으로 우리는 인수를 함수 '입력'으로 해석하므로 출력 인수는 피해야 함
  • 함수에서 상태를 변경해야 한다면 함수가 속한 객체 상태를 변경하는 방식 택하기

 

 

-명령과 조회 분리하라

  • 함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야 함(둘 다 하면 혼란 초래)

 

 

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

  • 오류 코드를 반환하면 호출자는 오류 코드를 곧바로 처리해야 하는 문제에 부딪힘
  • 예외를 사용하면 오류 처리 코드가 원래 코드에서 분리되므로 코드 깔끔해짐

 

 

-Try/ Catch 뽑아내기

  • try/ catch 블록은 코드 구조에 혼란 일으키며, 정상 동작과 오류 처리 동작을 뒤섞음
  • 별도 함수로 뽑아내는 게 좋음 -> 코드 이해, 수정이 쉬워짐
  • 오류 처리도 한 가지 작업이기 때문에 오류 처리 함수는 오류만 처리해야 함

 

 

-반복하지 마라

  • 중복은 모든 악의 근원
  • 코드 길이가 늘어날 뿐 아니라 알고리즘이 변하면 여러 곳을 손봐야 함 -> 오류 발생 확률 높음
  • 중복 없애면 모듈 가독성이 크게 높아짐

 

 

-구조적 프로그래밍

  • Edsger Dijkstra는 함수는 return문이 하나여야 하며, 루프 안에서 break나 continue를 사용해선 안 되며, 절대 goto는 안 된다고 함 -> 함수를 작게 만든다면 간혹 return, break, continue를 사용해도 괜찮음(goto는 큰 함수에서만 의미 있으므로 작은 함수에서는 피하기)

 

 

-결론

  • 프로그래밍의 기술은 언어 설계의 기술
  • 시스템은 구현할 프로그램이 아니라 풀어갈 이야기
  • 함수가 분명하고 정확한 언어로 깔끔히 맞아 떨어져야 이야기를 풀어가기가 쉬움

 

 

'Book' 카테고리의 다른 글

[브런치북] 스타트업, 그리고 개발이야기  (0) 2021.03.27
Clean code | 4장 주석  (0) 2021.01.15
Clean Code | 2장 의미 있는 이름  (0) 2021.01.13
Clean Code | 1장 깨끗한 코드  (0) 2021.01.12

Tiny Star