17장에서는 다양한 ‘코드 냄새'를 소개한다.
주석
주석은 코드와 설계에 기술적인 설명을 부연하는 수단으로, 코드만으로 다하지 못하는 설명을 부언한다.
- 부적절한 정보
- 쓸모 없는 주석
- 중복된 주석
- 성의 없는 주석
- 주석 처리된 코드
환경
빌드와 모든 단위 테스트는 한 명령으로 수행할 수 있어야 한다.
- 여러 단계로 빌드해야 한다
- 여러 단계로 테스트해야 한다
함수
- 너무 많은 인수
- 출력 인수
- 플래그 인수
boolean
인수는 함수가 여러 기능을 수행한다는 의미이다.
- 죽은 함수
일반
- 한 소스 파일에 어려 언어를 사용한다
- 당연한 동작을 구현하지 않는다
- 최소 놀람의 원칙에 따라 함수나 클래스는 다른 프로그래머가 당연하게 여길 동작과 기능을 제공해야 한다.
- 경계를 올바로 처리하지 않는다
- 스스로의 직관에 의존하지 말고 모든 경계 조건을 찾아내고 테스트 해야 한다.
- 안전 절차 무시
- 중복
- DRY(Don’t Repeat Yourself) 원칙
- 코드에서 중복을 발견하는 것을 추상화를 할 기회로 여겨라.
- 추상화 수준이 올바르지 못하다
- 모든 저차원 개념은 파생 클래스에 넣고 모든 고차원 개념은 기초 클래스에 넣는다.
- 기초 클래스가 파생 클래스에 의존한다
- 일반적으로 기초 클래스는 파생 클래스를 아예 몰라야 한다.
- 과도한 정보
- 죽은 코드
- 수직 분리
- 변수와 함수는 사용되는 위치에 가깝게 정의한다.
- 일관성 부족
- 잡동사니
- 인위적 결합
- 함수, 상수, 변수를 선언할 때는 올바른 위치를 고민해야 한다.
- 기능 욕심
- 선택자 인수
- 모호한 의도
- 잘못 지운 책임
- 부적절한 static 함수
- static 함수는 재정의할 가능성이 없을 때 정의하는 것이 좋다.
- 서술적 변수
- 계산을 여러 단계로 나누고 중간 값으로 서술적인 변수 이름을 사용한다.
- 이름과 기능이 일치하는 함수
- 알고리즘을 이해하라
- 구현이 끝났다고 선언하기 전 함수가 돌아가는 방식을 확실히 이해하는지 확인해야 한다.
- 논리적 의존성은 물리적으로 드러내라
- If/Else 혹은 Switch/Case문보다 다형성을 사용하라
- 표준 표기법을 따르라
- 매직 숫자는 명명된 상수로 교체하라
- 정확하라
- 관례보다 구조를 사용하라
- 조건을 캡슐화하라
- 부정 조건은 피하라
- 함수는 한 가지만 해야 한다
- 숨겨진 시간적인 결합
- 일관성을 유지하라
- 경계 조건을 캡슐화하라
- 함수는 추상화 수준을 한 단계만 내려가야 한다
- 설정 정보는 최상위 단계에 둬라
- 추이적 탐색을 피하라
테스트
- 불충분한 테스트
- 테스트 케이스는 잠재적으로 깨질 만한 부분을 모두 테스트해야 한다.
- 커버리지 도구를 사용하라
- 사소한 테스트를 건너뛰지 마라
- 무시한 테스트는 모호함을 뜻한다
- 경계 조건을 테스트하라
- 버그 주변은 철저히 테스트하라
- 실패 패턴을 살펴라
- 테스트 커버리지 패턴을 살펴라
- 테스트는 빨라야 한다
이 책을 읽은지 몇 달이 되어서 가물가물한 부분도 많았는데 이 장을 읽으면서 주석부터 테스트까지 다시 한 번 주의해야 할 점들을 복습할 수 있어서 좋았다. 나중에 코딩할 때도 이 장을 자주 참고하게 될 것 같다.