3장에선 함수(메서드)에 대한 내용이다. 어떤 함수가 깔끔한 함수인지 설명한다.
1. 함수는 작아야한다.
함수의 소스코드 자체가 짧아야 한다. 이는 결국 복잡한 조건문과 반복문이 엉켜있어선 안된다는 소리다.
코드가 길면 보기 어려워진다. 정확히는 하나의 블록에 속하는 코드가 길면 길수록 보기는 어려워진다.
2. 함수는 하나의 일만 해야 한다.
함수가 여러가지 일을 해서는 안된다. 여러가지 일을 한다는 것은 여러 부수효과(side-effect)를 발생시키기 아주 쉽기 때문이다.
중요한 것은, "한가지 일" 인지 "여러가지 일" 인지 어떻게 구분하는가? 이다. 만일 게시판에 글을 작성하는 writePost 함수에서, 글을 작성하는 과정은 인증과, 실제 글쓰기 2가지로 나뉜다. 즉
- 사용자에게 쓰기권한이 있는지 확인한다.
- 쓰기권한이 있다면 글을 쓴다.
- 쓰기권한이 없다면 글을 쓰지 않는다.
와 같은 일을 할 것이다. 그럼 이건 3가지 일이라 봐야 하는가? 이 책에서 한가지 일 이란, 한가지의 추상화수준으로 동작을 설명할 수 있는 동작을 의미한다. 위 일을 수행하는 코드 하나를 작성해보자.
public void writePost(User user, Post post){
if(session.get("ID").equals(user.getId() && session.get("permission").equals(user.getPermission())){
dao.write(post);
}
}
이 코드는 분명히 위에 적은 일을 한다. 하지만 추상화수준이 하나인가? if문 에서 실행하는 실행문은 "글을 쓴다" 라는 수준이지만, if문의 조건절은 "사용자에게 권한이 있는가? 가 아니라 "사용자의 아이디와 로그인된 아이디를 비교하고, 사용자의 권한과 로그인된 권한을 비교한다" 라는 더 낮은 수준의 추상화단계를 표현한다. 즉 이 코드는 추상화수준이 한개가 아니다. 따라서 더 나눌 수 있다.
public void writePost(User user, Post post){
if(canWritePost(user){
dao.write(post);
}
}
public boolean canWritePost(User user){
return (session.get("ID").equals(user.getId() && session.get("permission").equals(user.getPermission()));
}
이렇게, 권한을 확인하는 코드를 다른 함수로 분리하여 "동일한 수준의 추상화"를 가지게 만들 수 있다. 보기도 훨씬 좋다.
역으로, 함수내의 어떤 코드를 "의미 있는 이름"으로 다른 함수로 만들어 추출할 수 있다면 그 함수는 여러 작업을 하는 것이다.
한 함수내에서 추상화수준이 다르면 특정 개념이 근본적인 것인지, 세부 사항인건지 구분하기 여렵기 때문에 헷갈린다.
3. 위에서 아래로 코드읽기 : 내려가기 규칙
함수를 작성하면 반드시 그 함수에서 다른 함수를 호출하게 된다. 2번항목을 따라 했다면 자연스럽게 추상화수준이 높은 함수에서 추상화수준이 낮은 함수를 호출하게 될 것이다. 이 때 이 함수들의 배치는 추상화수준이 높은 함수부터 낮은 함수순서로 배치해야 한다. 즉, 한 함수아래에는 그 함수에서 호출하는 함수가 위치해야 한다.
만약, 이렇게 했는데 작성하지 못한 높은 추상화수준의 함수가 있다면, 이는 다른 클래스로 빼는 것을 고려해야 한다. 단일 책인 원칙을 위반한 것일 가능성이 높기 때문이다.
4. switch문, if-else 체인
이들은 근본적으로 작게 만들기 어렵다. 태생자체가 여러가지 일을 처리하는 것이기 때문이다. 프로그램은 본질적으로 여러 일을 하기 때문에 이를 완전히 피할 수는 없다. 따라서 최대한 적게 사용해야 한다. 그 방법중에 하나로 이를 제일 낮은 추상화수준의 함수에 숨기는 것이다.
'IT 책 독서록' 카테고리의 다른 글
| [객체지향의 사실과 오해] 1 ~ 3장 통합 정리, 자바에선 어떻게 이걸 적용했나? (0) | 2022.02.23 |
|---|---|
| [Clean Code] 3장 함수 (2) (0) | 2022.02.21 |
| [객체지향의 사실과 오해] 4장 내용정리 (0) | 2021.07.29 |
| [객체지향의 사실과 오해] 3장 내용정리 (0) | 2021.07.20 |
| [객체지향의 사실과 오해] 2장 내용 정리 (0) | 2021.07.14 |