Clean Code 03장. 함수
TIL(Today I Learn)
2024.06.25
오늘 읽은 범위
3장. 함수
책에서 기억하고 싶은 내용을 써보세요.
함수는 작게 작성해야 한다.
- 함수의 들여쓰기 레벨은 1 또는 2보다 크면 안 된다.
- 블록을 둘러싸는 함수가 작게 유지될수록 블록 내에서 호출되는 함수의 목적을 잘 나타낼 수 있다.
함수는 하나만 수행한다. 그 하나를 제대로 수행한다. 그 하나만을 수행한다.
함수는 정의된 영역에서 동일한 추상화 수준을 표현해야 한다.
함수가 정의된 영역에서 동일한 추상화 수준을 표현한다면 “한 가지 일”을 제대로 수행한다고 할 수 있다.
함수를 작성하는 이유는 상위 추상화 레벨(즉, 함수의 이름)을 하위 추상화 레벨의 일련의 단계로 나눠서 처리하기 위함이다.
함수가 “한 가지 일”을 수행하는지 확인하려면 함수 내의 명령문이 모두 동일한 추상화 수준에 있는지 확인한다.
- 스텝 다운 규칙
- 함수는 호출 단계가 깊어짐에 따라서 하향식으로 추상화 수준이 낮아진다.
- 코드는 하향식 서술처럼 읽혀져야 한다.
- switch 문을 피할 수는 없지만 switch 문을 하위 수준 클래스에 감추어 반복되지 않도록 구성할 수 있다.
- ex) switch 문을 abstract factory를 활용하여 외부에 노출하지 않을 수 있다.
- 한 가지 작업을 수행하는 작은 함수에 좋은 이름을 선택하는 것은 중요하다.
- 기능이 더 작고 집중적일수록 설명이 포함된 이름을 선택하기 쉽다.
설명적인 이름을 선택하면 모듈 디자인이 명확해지며 모듈을 개선하는 데 도움이 될 수 있다.
이상적인 함수의 인수는 0개다. 그 다음은 1개다. 그 다음은 2개다. 가능하면 3개 이상의 인수는 피해야 한다.
인수는 함수 이름과 다른 추상화 수준에 해당할 수 있으며, 코드를 해석하는 시점에 중요하지 않은 세부 정보(하위 수준의 정보)를 알도록 강요한다.
- 함수 테스트 관점에서 인수가 많을 수록 테스트 케이스로 검증해야 하는 케이스가 많아진다.
- ex) 세 개 이상의 인수를 사용하면 적절한 값의 모든 조합을 검증하는 것이 쉽지 않다.
- 플래그 정보를 인수로 전달하는 함수는 최악이다. 부울 값을 함수에 전달하는 것은 정말 끔찍한 습관이다.
- 함수가 한 가지 이상의 작업을 수행한다는 것을 대놓고 선언하는 것과 같다.
함수에 2~3개 이상의 인수가 필요한 경우 해당 인수 중 일부를 자체 클래스로 래핑해야 할 가능성이 높다.
함수에 좋은 이름을 선택하면 함수의 의도와 인수의 순서 및 의도를 설명하는 데 큰 도움이 될 수 있다.
함수에서 의도되지 않은 기능은 수행되지 않아야 한다. 잘못 설계된 함수는 한 가지 기능을 약속했지만 다른 숨겨진 기능도 수행할 수 있다.
일반적으로 출력 인수는 피해야 한다. 함수가 무언가의 상태를 변경해야 하는 경우 소유 객체의 상태를 변경하는 것이 좋다.
함수는 객체의 상태를 변경하거나 해당 객체에 대한 일부 정보를 반환해야 한다. 두 가지를 동시에 수행하면 혼란이 발생할 수 있다.
- 명령 함수에서 오류 코드를 반환하는 것은 명령과 쿼리의 분리를 미묘하게 위반하는 행위다.
- 반환된 오류 코드 대신 예외를 사용하면 오류 처리 코드를 별도로 분리할 수 있다.
함수는 한 가지 일을 해야 한다. 오류 처리가 한 가지 일이다. 따라서 오류를 처리하는 함수는 다른 작업을 수행하면 안된다.
중복은 소프트웨어의 모든 악의 근원이다. 이를 통제하거나 제거할 목적으로 많은 원칙과 관행이 만들어졌다.
- 코드를 지속적으로 개선하는 작업을 수행해야 한다.
- 기능 분리, 이름 변경, 중복 제거, 메서드 추출, 테스트 수행 등등
오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.
제대로 된 함수를 작성하기 위해서는 신경 써야 할 것들이 정말 많다는 것을 배울 수 있었다. 가장 기억에 남는 문장은
함수는 하나만 수행한다. 그 하나를 제대로 수행한다. 그 하나만을 수행한다.
이다.함수는 정의된 영역에서 동일한 추상화 수준을 표현해야 하는 부분이 제일 이해하기 힘든 부분이었다. 추상화 수준에 따라서 함수를 배치해야 하며, 단계가 깊어짐에 따라서 하향식으로 추상화 수준이 낮아져야 한다는데, 이 부분은 실제 많은 코드를 작성해보면서 고민하고 분석해보는 연습이 필요할 것 같다.
내가 작성한 코드는 내가 가장 잘 이해할 수 있다. 하지만 내가 작성하는 코드는 남들에게도 자연스럽게 읽혀야 한다. 구현하는 기능만 신경쓰지 말고 이런 부분들도 고민하는 개발자가 되어야 한다.
궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.
- 함수의 기능을 잘 설명하는 함수 이름을 선택하는 노하우가 궁금하다.