오늘은 '함수는 한 가지만 해라'에 대해서 학습할 것이다.
저번에 클린코드 연습하는데,
아무리 해도 메서드 작게 쪼개기가 안 되는 것이었다...!
또 한 번 학습의 중요성을 느끼고...
💡 어떤 프로그램이든 가장 기본적인 단위가 함수다.
✔️ 작게 만들어라
함수를 만드는 첫째 규칙은 '작게'다.
함수를 만드는 둘째 규칙은 '더 작게'다.
그럼 함수가 얼마나 짧아야 할까?
일반적으로 다음 예시 코드정도가 마땅하다.
public static String renderPageWithSetupsAndTeardowns (PageData pageData, boolean isSuite) throws Exception {
if (isTestPage(pageData))
includeSetupAndTeardownPages(pageData, isSuite);
return pageData.getHtml();
}
✔️ 블록과 들여쓰기
if 문/else 문/while 문 등에 들어가는 블록은 한 줄이어야 한다.
→ 대개 거기서 함수를 호출한다.
그러면 바깥을 감싸는 함수가 작아질 뿐 아니라, 블록 안에서 호출하는 함수 이름을 적절히 짓는다면,
코드를 이해하기도 쉬워진다!
💡 즉, 중첩 구조가 생길만큼 함수가 커져서는 안 된다.
∴ 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다.
✔️ 한 가지만 해라!
함수는 한 가지를 해야 한다.
그 한 가지를 잘 해야 한다.
그 한 가지만을 해야 한다.
🤔 그럼 그 '한 가지'가 무엇일까?
💡 지정된 함수 이름 아래에서, 추상화 수준이 하나인 단계만 수행한다면,
그 함수는 한 가지 작업만 한다.
예를 들어, 위의 예시 코드인
public static String renderPageWithSetupsAndTeardowns (PageData pageData, boolean isSuite) throws Exception {
if (isTestPage(pageData))
includeSetupAndTeardownPages(pageData, isSuite);
return pageData.getHtml();
}
이 코드를 보자.
그럼 다음의 세 가지를 한다고 주장할 수 있다.
- 페이지가 테스트 페이지인지 확인한다.
- 그렇다면 설정 페이지와 해제 페이지를 넣는다.
- 페이지를 HTML로 렌더링한다.
하지만 이 세 단계는 하나의 함수 아래에서 추상화 수준이 하나다.
이 함수는 다음의 문장으로 기술할 수 있다.
페이지가 테스트 페이지인지 확인한 후,
테스트 페이지라면 설정 페이지와 해제 페이지를 넣는다.
테스트 페이지든 아니든 페이지를 HTML로 렌더링한다.
→ 이 의미를 유지하면서 더 이상 줄이기란 불가능하다.
함수가 '한 가지'만 하는지 판단하는 방법을 조금 더 쉽게 설명해 보자.
💡 의미 있는 이름(기능을 하는)으로 다른 함수를 추출할 수 있다면,
그 함수는 여러 작업을 하는 셈이다.
✔️ 함수 당 추상화 수준은 하나로
함수가 확실히 '한 가지' 작업만 하려면,
함수 내 모든 문장의 추상화 수준이 동일해야 한다.
💡 내려가기 규칙: 위에서 아래로 코드 읽기
- 코드는 위에서 아래로 이야기처럼 읽혀야 좋다.
- 한 함수 다음에는 추상화 수준이 한 단계 낮은 수준이 온다.
- 즉, 위에서 아래로 프로그램을 읽으면, 함수 추상화 수준이 한 번에 한 단계씩 낮아진다.
✔️ 서술적인 이름을 사용하라
코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행한다면,
깨끗한 코드라 부를 수 있다.
💡 함수가 작고 단순할수록 서술적인 이름을 고르기도 쉬워진다.
예를 들어,
testableHtml → SetupTeardownIncluder로 변경하면,
함수가 하는 일을 좀 더 잘 표현할 수 있다.
❗ 이름이 길어도 괜찮다.
길고 서술적인 이름이 짧고 어려운 이름보다 좋다.
단, 이름을 붙일 때는 일관성이 있어야 한다.
모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용한다.
예를 들어
- includeSetupAndTeardownPages
- includeSetupPages
- includeSuiteSetupPage
- includeSetupPage
등이 좋은 예다.
문체가 비슷하면, 이야기를 순차적으로 풀어가기도 쉬워진다!
인상 깊은 문장이 있었다.
어떤 코드든 절대로 무시하면 안 된다.
무시한 코드에 오류가 숨어드니까.
참고: Clean Code 클린 코드 애자일 소프트웨어 장인 정신 / 로버트 C. 마틴 저
'객제지향, TDD, 클린코드 > 클린코드' 카테고리의 다른 글
객체와 자료 구조 (0) | 2023.04.19 |
---|---|
경계 & 일급 컬렉션이란? (0) | 2023.03.24 |
클래스는 작아야 한다! (0) | 2023.03.22 |
깨끗한 테스트 코드 유지하기 (0) | 2023.03.17 |
오류 코드보다 예외를 사용하라 (0) | 2023.03.08 |