어떤 프로그램이든 가장 기본적인 단위는 함수이다.
때문에 함수를 잘 만드는 것은 매우 중요하다!
작게 만들어라
- 일반적으로 5줄보다 짧아야 한다. 하지만 5줄로 함수를 구현하는 것은 쉽지 않기 때문에 연습해야 한다.
- 중첩 구조가 생길 만큼 함수가 커져서는 안 된다.
한 가지만 해라
- 함수는 한 가지를 해야 하며, 그 한 가지를 잘해야 한다.
- 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행해야 한다.
- 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하고 있는 것이다.
추상화 수준은 하나로
- 함수가 한 가지 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다.
- 근본 개념과 세부사항이 한 번 뒤섞이면 함수에 세부사항이 끝없이 추가된다.
- 하나의 함수를 구현하고 난 뒤에는 추상화 수준이 한 단계 낮은 함수가 와야 한다.
- 높은 추상화 수준 : getHtml();
- 중간 추상화 수준 : String pagePathName = PathParser.render(pagepath);
- 낮은 추상화 수준 : append("\n");
Switch문
- Switch문은 작게 만들기 어렵다.
- 한 가지 작업만 하는 구문을 만들기도 어렵다. 본질적으로 N가지 작업을 처리한다.
- 추상 팩토리에 숨기면 문제를 해결할 수는 있지만, 가능한 한 switch문은 한 번만 사용해야 한다.
서술적인 이름을 사용하라
- 함수가 하는 일을 더 잘 표현하는 것이 중요하다.
- 길고 서술적인 이름이 짧고 어려운 이름보다 좋다. 길어도 괜찮다!
- 서술적인 이름을 사용하면 설계가 뚜렷해져 코드를 개선하기 쉬워진다.
함수 인수
- 함수에서 이상적인 인수는 0개다. 다음은 1개고, 다음은 2개다. 3개부터는 피하는 것이 좋다.
- 많은 인수는 개념을 이해하기 어렵게 만든다.
- 인수가 많아질 경우 독자적인 클래스로 빼내어 인수를 줄이는 방법이 있다.
- 함수로 boolean 값을 넘기는 것은 끔찍하다.
- 함수가 여러 가지 일을 처리한다고 공표하는 셈이다. 참이면 이것, 거짓이면 저것.
명령과 조회를 분리하라
if (set("username", "unclebob")) ...
- 위와 같은 코드는 독자 입장에서 무슨 의미인지 알 수 없다.
- set이라는 단어가 동사인지 형용사인지 분간하기 어려운 탓이다.
if (attributeExists("username")) {
setAttribute("username", "unclebob");
}
- 위처럼 명령과 조회를 분리해 독자가 혼란해하지 않도록 해야 한다.
Try/Catch 블록 뽑아내기
- try/catch 블록은 코드 구조에 혼란을 일으키며, 정상 동작과 오류 처리 동작을 뒤섞는다.
- 때문에 두 코드 블록을 메서드로 분리하면 코드를 이해하고 수정하기 쉬워진다.
구조적 프로그래밍
- 모든 함수와 함수 내 모든 블록에는 입구와 출구가 하나만 존재해야 한다.
- 즉, 함수는 return 문이 하나여야 한다.
- 루프 안에서 break, continue를 사용해서는 안 되며 goto는 절대로 안 된다.
- 하지만 함수가 작다면 위 규칙에서 이익을 얻기 힘드므로 return, break, continue를 사용해도 괜찮다.
3장 마지막에 예시로 나와있는 코드가 너무 충격적이다... 메서드가 15개를 넘어가는데 전부 5줄 이하에 앞서 말한 규칙을 모두 지키고 있다... 충격과 공포이면서 난 아직 멀었다는 것을 느꼈다. 더더더 공부해야겠다.
'Book > 클린코드' 카테고리의 다른 글
[클린코드] 6장 객체와 자료구조 (0) | 2023.09.14 |
---|---|
[클린코드] 5장 형식 맞추기 (0) | 2023.09.11 |
[클린코드] 4장 주석 (0) | 2023.09.11 |
[클린코드] 2장 의미 있는 이름 (0) | 2023.09.10 |
[클린코드] 1장 깨끗한 코드 (0) | 2023.09.10 |