목차 [함수]
: 함수를 잘 만드는 법에 대해
1. 작게 만들어라!
- 둘째 규칙은 '더 작게!'다. 중첩 구조가 생길만큼 함수가 커져선 안된다. 들여쓰기 수준은 1단이나 2단을 넘어서면 안된다.
2. 한 가지만 해라!
- 문제는 '한 가지'가 무엇인지 알기 어렵다는 점이다.
지정된 함수 아래서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업을 하는 것이다.
3. 함수당 추상화 수준은 하나로!
- '내려가기 규칙': 한 함수 다음엔 추상화 수준이 한 단계 낮은 함수가 온다.
위에서 아래로 이야기처럼 읽혀야 좋다.
4. Switch
- switch문은 N가지를 처리한다. 안타깝게도 Switch문을 완전히 피할 방법은 없다.
다형성을 이용하라. (switch문을 추상 팩토리에 숨기는 등).
나는 switch문을 단 한 번만 참아준다. 다형적 객체를 생성하는 코드 안에서다.
5. 서술적인 이름을 사용하라!
- 이름이 길어도 괜찮다. 길고 서술적인 이름이 짧고 어려운 이름보다, 서술적인 주석보다 좋다. 이런저런 이름을 넣어 코드를 읽어보라. 일관성 있는 이름을 붙여라.
6. 함수 인수
- 이상적인 인수 개수는 0개다. 차선은 1개다.
인수가 1개인 함수의 흔한 경우는 두 가지다. 1. 인수에 질문을 던지는 경우 2. 인수를 뭔가로 변환해 반환하는 경우
플래그 인수는 추하다. 함수가 여러 가지를 처리한다고 공표하는 셈이니까! render(true)가 있다면 renderForSuite(), renderFsingleTest()로 나눠라.
*플래그 인수는 함수에 Bool / String / Enum 등을 함께 넘겨서 로직을 분기하는 방법이다
인수가 2~3개 필요하다면 클래스 변수로 선언하는 것을 고려하라.
7. 부수 효과를 일으키지 마라!
- 출력 인수를 피하라.
public void appendFooter(StringBuffer report) {
}
위 함수는 StringBuffer 객체에 Footer를 추가(append)하는 함수이다. 이 때의 인수를 '출력인수'라고 한다. 출력인수를 피해야하는 이유는 '인지적인 이유'로 가독성을 떨어트리기 때문이다.
8. 명령과 조회를 분리하라!
- 함수는 수행하거나 답하거나 둘 중 하나만 해야 한다.
9. 오류 코드보다 예외를 사용하라!
- 명령 함수에서 오류 코드를 반환하는 것은 명령/조회 분리 규칙을 위반한다. 자칫하면 if 문에서 명령을 표현식으로 사용하기 쉬운 탓이다. Ex) if (deletePage(page) == E_OK)
오류 코드 대신 예외를 사용하면 오류 처리 코드가 원래 코드에서 분리되므로 코드가 깔끔해진다.
Try/Catch 블록은 별도 함수로 뽑아내는 편이 좋다.
10. 반복하지 마라!
- 객체 지향 프로그래밍은 코드를 부모 클래스로 몰아 중복을 없앤다. 구조적 프로그래밍, AOP, COP 모두 어떤 면에서 보면 중복 제거 전략이다.
11. 구조적 프로그래밍
- 함수를 작게 만든다면 간혹 return, break, continue를 여러 차례 사용해도 괜찮다. 오히려 때로는 단일 입/출구 규칙보다 의도를 표현하기 쉬워진다.
12. 함수를 어떻게 짜죠?
- 글짓기와 비슷하다. 먼저 생각을 기록한 후 읽기 좋게 다듬는다. 처음엔 길고 복잡하다. 들여쓰기도 많고 중복된 루프도 많다. 하지만 나는 그 서투른 코드를 빠짐없이 테스트하는 단위 테스트 케이스도 만든다. 그런 후 다듬고, 함수를 만들고, 이름을 바꾸고, 중복을 제거한다. 때로는 전체 클래스를 쪼개기도 한다. 처음부터 탁 짜내지 않는다. 그게 가능한 사람은 없으리라.
13. 결론
- 함수는 그 언어에서 동사며, 클래스는 명사다. 여기서 설명한 규칙을 따른다면 길이가 짧고, 이름이 좋고, 체계가 집한 함수가 나오리라. 하지만 진짜 목표는 시스템이라는 이야기를 풀어가는 데 있다. 여러분이 작성하는 함수가 분명하고 정확한 언어로 깔끔하게 맞아떨어져야 이야기를 풀어가기가 쉬워진다는 사실을 기억하라.
'프로그래밍 > 책' 카테고리의 다른 글
클린코드 1장 (0) | 2022.07.07 |
---|---|
책에 대한 글들 (0) | 2021.07.12 |
[클린 아키텍처 -소프트웨어 구조와 설계의 원칙] (0) | 2021.07.12 |