코드 읽기 어려운 이유: 복잡성의 시각적 패턴
- 최근 코드베이스를 검토하면서 코드의 품질에도 불구하고 정신적으로 피로해지는 경험을 함. 이는 코드의 복잡성보다는 가독성과 관련이 있었음.
- 코드의 가독성을 높이기 위한 시각적 패턴을 조사하여 8가지 패턴을 도출함.
코드 가독성 메트릭과 대체 복잡성 메트릭
- 코드 가독성을 위한 일반적으로 사용되는 메트릭은 없음.
- Halstead 복잡성 메트릭과 "Cognitive Complexity"라는 두 가지 메트릭이 사용됨.
Halstead 복잡성 메트릭
- Maurice Halstead가 1970년대에 제안한 메트릭으로, 소스 코드의 경험적 측정을 시도함.
- 연산자와 피연산자의 수를 기반으로 프로그램의 "길이", "볼륨", "난이도" 등을 측정함.
Halstead 복잡성 JavaScript 예제
- 두 가지 코드 예제를 통해 Halstead 메트릭의 볼륨과 난이도를 비교함.
- 첫 번째 예제는 연산자와 피연산자의 수가 적어 읽기 쉬움.
Halstead 복잡성의 교훈
- 작은 함수와 적은 변수 사용이 가독성을 높임.
- 언어 특유의 연산자나 구문 설탕 사용을 피하는 것이 좋음.
"Cognitive Complexity"
- SonarSource에서 개발한 메트릭으로, 코드 읽기의 난이도를 측정함.
- 세 가지 주요 아이디어: 축약 구문, 선형 흐름의 중단, 중첩된 제어 흐름.
축약 구문
- 축약 구문은 작성하기 쉽고 읽기 쉬우나, 모든 가능성을 제대로 처리하지 못할 수 있음.
선형 흐름의 중단
- 조건문이 없는 "선형" 코드는 읽기 쉬움.
- 조건문, 루프, 예외 처리 등이 가독성을 저해할 수 있음.
중첩된 조건문/루프
- 중첩된 조건문은 읽기 어려움.
- 중첩 수준이 깊어질수록 가독성이 떨어짐.
함수 형태, 패턴, 변수
- 함수의 "형태"와 변수 사용이 가독성에 영향을 미침.
- 좋은 이름 사용, 짧은 변수 생명 주기, 익숙한 변수 사용 패턴이 중요함.
구별되고 설명적인 이름
- 설명적인 이름 사용이 가독성을 높임.
- 변수 섀도잉을 피해야 함.
짧은 생명 주기의 변수
- 변수의 생명 주기가 짧을수록 가독성이 높아짐.
익숙한 코드 패턴의 재사용
- 익숙한 코드 패턴을 재사용하면 가독성이 높아짐.
코드 가독성을 높이는 8가지 패턴
-
라인/연산자/피연산자 수: 작은 함수와 적은 변수를 사용.
-
새로움: 새로운 함수 형태, 연산자, 구문 설탕을 피하고, 공통 패턴을 재사용.
-
그룹화: 긴 함수 체인, 반복자, 이해를 논리적 그룹으로 나눔.
-
조건의 단순성: 조건 테스트를 짧게 유지하고, 동일한 논리 연산자를 선호.
-
Gotos: 특정 패턴을 따르지 않는 한 goto 사용을 피함.
-
중첩: 중첩 로직을 최소화하고, 깊은 중첩이 필요한 경우 별도의 함수로 분리.
-
변수 구별: 설명적이고 시각적으로 구별되는 변수 이름 사용.
-
변수 생명 주기: 변수의 생명 주기를 짧게 유지.
결론
- 다양한 소스에서 아이디어를 수집하여, 코드 가독성을 높이는 시각적 패턴을 도출함.
- 코드베이스의 여러 안티패턴이 가독성을 저해하고, 이는 버그를 놓치게 할 수 있음.
- 코드의 가독성을 높이기 위해 이러한 패턴을 고려해야 함.