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줄 요약
- 함수의 길이를 줄이자
- 인수의 개수를 줄이자
- 최선의 함수명을 선택하도록 노력하자
'클린코드' 카테고리의 다른 글
[DAY 7] 클린 코드 TIL - 4장. 주석 (0) | 2022.01.28 |
---|---|
[DAY 6] 클린 코드 TIL - 3장. 함수 (0) | 2022.01.27 |
[DAY 4] 클린 코드 TIL - 2장. 의미 있는 이름 (0) | 2022.01.25 |
[DAY 3] 클린 코드 TIL - 2장. 의미 있는 이름 (4) | 2022.01.24 |
[DAY 2] 클린 코드 TIL - 1장. 깨끗한 코드 (0) | 2022.01.22 |