클린코드

[DAY 5] 클린 코드 TIL - 3장. 함수

lado 2022. 1. 26. 23:51

TIL (2022.01.26)

DAY 5

🔖 오늘 읽은 범위 : 3장, 함수 (p.40 ~ p.54)


😀 책에서 기억하고 싶은 내용

  • 함수는 무조건 작게

  • if/else/while 문 등에 들어가는 블록은 한 줄이어야 한다. 대개 거기서 함수를 호출한다.

  • 중첩 구조가 생길 만큼 함수가 커져서는 안된다.

  • 함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다.

  • 함수를 만드는 이유는 큰 개념을 (다시 말해, 함수 이름을) 다음 추상화 수준에서 여러 단계로 나눠 수행하기 위해서다.

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

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

  • 한 함수 내에 추상화 수준을 섞으면 코드를 읽는 사람이 헷갈린다. 특정 표현이 근본 개념인지 아니면 세부 사항인지 구분하기 어려운 탓이다.

  • 내려가기 규칙

    • 코드는 위에서 아래로 이야기처럼 읽혀야 좋다. 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다. 즉, 위에서 아래로 프로그램을 읽으면 함수 추상화 수준이 한 번에 한 단계씩 낮아진다.
  • 코드를 변경할 이유가 여러 개라면 SRP(단일 책임 원칙)을 위반하는 것이다.

  • 유형을 추가할 때마다 코드를 변경해야 한다면 OCP(개방 폐쇄 원칙)을 위반하는 것이다.

  • switch문을 단 한 번만 참아준다. 다형적 객체를 생성하는 코드 안에서. 이렇게 상속 관계로 숨긴 후에는 절대로 다른 코드에 노출하지 않는다.

  • 길고 서술적인 이름이 길고 서술적인 주석보다 좋다.

  • 함수가 작고 단순할 수록 서술적인 이름을 고르기도 쉬워진다.

  • 모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용한다.

  • 함수에서 이상적인 인수 개수는 0개다. 테스트 관점에서도 인수는 없을 수록 좋다.

  • 함수 이름에서

  • 이벤트 함수는 이벤트라는 사실이 코드에 명확히 드러나야 한다. 그러므로 이름과 문맥을 주의해서 선택한다.

  • 변환 함수에서 출력 인수(출력할 때 쓰기 위한 인수)를 사용하면 혼란을 일으킨다. 입력 인수를 변환하는 함수라면 변환 결과는 반환값으로 돌려준다. 입력 인수를 그대로 돌려주는 함수라 할지라도 변환 함수 형식을 따르는 편이 좋다. 적어도 변환 형태는 유지하기 때문이다.

  • 플래그 인수는 추하다. 함수가 한꺼번에 여러 가지를 처리한다고 대놓고 공표하는 셈이니까.

  • 이항 함수는 가능하면 단항 함수로 바꾸도록 애써야 한다.

    • 직교 좌표계 점은 일반적으로 인수 2개를 취한다. (ex) (0, 0)
    • 인수를 2개를 받아야 한다면 인수 한 개는 클래스 구성원으로 만드는 방법도 있다. (ex) writeField(outputStream, name) ⇒ outputStream.writeField(name)
  • 인수가 2~3개 필요하다면 일부를 독자적인 클래스 변수로 선언할 수 있는지 고민해본다.

  • 단항 함수는 함수와 인수가 동사/명사 쌍을 이뤄야 한다. (ex) write(name)

  • 함수 이름에 인수 이름을 넣으면 인수 순서를 기억할 필요가 없어진다. (ex) assertExpectedEqualsActual(expected, actual)


🤔 오늘 읽은 소감은?

  • if/else/while 문 등에 들어가는 블록을 한 줄로 만들라는 말은 정말 충격적이다. 근데 생각해보면 아주 불가능한 일도 아닐 것 같긴 하지만 아무튼 문화 충격이었다.
  • 그동안 인수의 개수에 대해서 정말 별 고민이 없었던 것 같다. prop을 6개, 7개씩 넘기기도 했는데, 생각해보면 리액트 함수형 컴포넌트도 함수인 건데... 리팩토링이 시급하다.
  • 추상화에 대한 부분이 인상 깊다. 얼마 전까지만 해도 아예 개념 자체가 없었는데, 추상화를 맞춰주는 것만으로도 훨씬 가독성 좋은 코드를 만들 수 있는 것 같다. 하지만 추상 클래스에 대한 부분은 아직 잘 이해가 안 간다.
  • 위에서 아래로 이야기처럼 읽히도록 코드를 작성하면 정말 가독성에 좋을 것 같다.
  • 플래그 인수도 웬만하면 쓰지 않도록 노력해봐야겠다.
  • 왜 그렇게 변수명 때문에 괴로워하는 개발자 밈이 많은지 이제 좀 알겠다.

🧐 궁금한 내용이 있거나, 잘 이해되지 않는 내용

  • 다형성이란 개념이 아직 잘 이해가 되지 않는다.

📌 소감 3줄 요약

  • 함수의 길이를 줄이자
  • 인수의 개수를 줄이자
  • 최선의 함수명을 선택하도록 노력하자