셀 수 있는 모든 구성요소(파일, 폴더 깊이, 클래스, 함수, 분기, 변수, 테이블, 필드, 테스트 케이스…)는 비용이라는 관점. 심플 디자인의 네 번째 규칙을 실무 기준으로 풀어낸 것이다.
왜 비용인가
- 찾는 비용: 폴더가 깊고 파일이 많으면 탐색이, 비슷한 이름이 많으면 검색이 어려워진다
- 이해하는 비용: 분기가 많으면 흐름을, 변수가 많으면 상태를 머리에 담아야 한다(인지 부하). 호출 스택이 깊으면 전체 동작을 그리기 어렵다
- 바꾸는 비용: 계층과 파일이 많은 구조는 변경할 때도 그만큼 많이 고쳐야 한다. 중복처럼 많은 구성요소도 변경에 저항한다
무엇부터 줄이나
- 분기: 독립 실행 경로 수(순환 복잡도, Cyclomatic Complexity)는 측정 도구로 셀 수 있다
- 상태: 재사용되지 않는 지역 변수, 인덱스 변수(반복은 파이프라인으로), 중간 연산용 멤버 변수
- 예외 처리 코드: 대부분은 잡지 말고 던져서 경계에서 한 번에 처리한다(예외 처리 원칙)
- 테스트 케이스: 커버리지가 겹치는 테스트가 많으면 한 번 고칠 때 여러 개가 깨져 오히려 변경을 막는다. 커버리지는 유지하며 겹침을 줄인다(테스트 냄새)
함수 크기의 기준(강의의 제안)
위로는 스크롤 없이 한눈에(대략 15줄 안팎), 인자 4개·지역 변수 3개 이내. 아래로는 테스트를 만들 필요도 없을 만큼 자명하거나 바깥에서 쓸 일이 전혀 없다면 너무 작게 쪼갠 것이다. 중복이 없는데 쪼개는 추출은 요소만 늘린다(함수 추출하기).
비즈니스 가치가 없는 일, 예컨대 폴더 깊이 맞추기 같은 과도한 일관성을 위해 요소를 늘리지 않는다. 좋은 점검 질문: 이번 리팩터링이 중복을 없애거나 구성요소를 줄였나? 아니라면 품질을 개선한 게 아니다.
출처: 인프런 『심플 디자인』 박영록