[17장] 냄새와 휴리스틱
🚩 나쁜 코드 정리하기
주석
- 부적절한 정보
- 다른 시스템에 저장할 정보는 주석으로 적절하지 않다
- 작성자, 최종 수정일, SPR 번호
- 쓸모없는 주석
- 오래된 주석, 엉뚱한 주석, 잘못된 주석
- 쓸모없는 주석은 빠르게 삭제하는 것이 좋다
- 중복된 주석
- 주석은 코드만으로 다하지 못하는 설명을 부언한다
- 성의없는 주석
- 간결하고 명료하게 가치 있는 주석을 작성한다
- 주석 처리된 코드
- 주석으로 처리된 코드를 발견하면 즉각 삭제한다
환경
- 여러 단계로 빌드해야 한다
- 한 명령으로 전체 를 체크아웃해서 한 명령으로 빌드할 수 있어야 한다
- 여러 단계로 테스트해야 한다
- 모든 단위 테스트는 한 명령으로 돌려야 한다
- 모든 테스트를 한번에 실행하는 능력은 아주 근본적이고 아주 중요하다
함수
- 너무 많은 인수
- 함수에서 인수 개수는 작을수록 좋다
- 출력 인수
- 직관을 정면으로 위반하게 됨
- 함수에서 상태를 변경해야한다면 함수가 속한 개체의 상태를 변경한다
- 플래그 인수
boolean
인수는 함수가 여러 기능을 한다는 증거이므로 피한다
- 죽은 함수
- 아무도 호출하지 않는 함수는 삭제한다
일반
- 한 소스 파일에 여러 언어를 사용한다
- 소스 파일 하나에 언어 하나만 사용하라
- 당연한 동작을 구현하지 않는다
- 경계를 올바로 처리하지 않는다
- 모든 경계 조건을 찾아내고, 모든 경계조건을 테스트하는 테스트 케이스를 작성하라
- 안전 절차 무시
- 컴파일러 경고를 무시하지 않는다
- 중복
- 가장 중요한 규칙
- 코드에서 중복을 발견할 때마다 추상화할 기회로 간주하라
- 중복의 유형
- 똑같은 코드가 여러 차례 나오는 중복
- 여러 모듈에서 일련의 조건문으로 똑같은 조건을 거듭 확인하는 중복
- 알고리즘이 유사하나 코드가 다른 중복
- 추상화 수준이 올바르지 못하다
- 추상화로 개념을 분리할 때는 철저해야 한다
- 모든 저차원 개념은 파생 클래스에 넣고, 모든 고차원 개념은 기초 클래스에 넣는다
- 추상화로 개념을 분리할 때는 철저해야 한다
- 기초 클래스가 파생 클래스에 의존한다
- 기초 클래스는 파생 클래스를 아예 몰라야 한다
- 기초 클래스와 파생 클래스를 다른 JAR 파일로 배포하라
- 과도한 정보
- 클래스나 모듈 인터페이스에 노출할 함수를 제한할 줄 알아야 한다
- 정보를 제하해 결합도를 낮춰라
- 죽은 코드
- 시스템에서 제거하라
- 수직 분리
- 변수와 함수는 사용되는 위치에 가깝게 정의하라
- 일관성 부족
- 비슷한 함수에서 사용한다면 다른 함수에서도 일관성 있게 동일한 변수 이름을 사용한다
- 잡동사니
- 쓸모없는 코드는 제거한다
- 인위적 결합
- 서로 무관한 개념을 인위적으로 결합하지 않는다
- 함수, 변수, 상수를 선언할 때는 시간을 들여 올바른 위치를 고민한다
- 기능 욕심
- 선택자 인수
- 인수를 넘겨 동작을 선택하는 대신 새로운 함수를 만드는 것이 좋다
- 모호한 의도
- 코드를 짤 때는 최대한 의도를 분명히 드러낸다
- 잘못 지운 책임
- 부적절한 static 함수
- static함수보다 인스턴스 함수가 좋다
- 서술적 변수
- 서술적으로 변수 이름을 사용하여 단계를 나눈다
- 이름과 기능이 일치하는 함수
- 알고리즘을 이해하라
- 알고리즘을 충분히 이해한 후 코드를 구현하라
- 논리적 의존성은 물리적으로 드러내라
- 의존하는 모듈이 상대 모듈에 대해 뭔가를 가정하면 안된다
- 의존하는 모든 정보를 명시적으로 요청하는 편이 좋다
- if/else 혹은 switch/case 보다 다형성을 사용하라
- 표준 표기법을 따르라
- 매직 숫자는 명명된 상수로 교체하라
- ex)
SECONDS_PER_DATE
- ex)
- 정확하라
- 관례보다 구조를 사용하라
- 설계 결정을 강제할 때는 규칙보다 관레를 사용한다
- 조건을 캡슐화하라
- 조건의 의도를 분명히 밝히는 함수로 표현하라
- 부정 조건은 피하라
- 함수는 한 가지만 해야 한다
- 숨겨진 시간적인 결합
- 함수를 짤 때는 함수 인수를 적절히 배치해 함수가 호출되는 순서를 명백히 드러낸다
- 일관성을 유지하라
- 코드 구조를 잡을 때는 이유를 고민해라
- 경계 조건을 캡슐화하라
- 경계 조건을 빼먹거나 놓치지 않도록 여기저기에서 처리하지 않는다
- 함수는 추상화 수준을 한 단계만 내려가야 한다
- 설정 정보는 최상위 단계에 둬라
자바
- 긴 import 목록을 피하고 와일드 카드를 사용하라
- 상수는 상속하지 않는다
- 상수 대 Enum
이름
- 서술적인 이름을 사용하라
- 이름은 성급하게 작명하지 않는다
- 이름을 잘 지으면 기능도 잘 알 수 있다
- 적절한 추상화 수준에서 이름을 선택하라
- 구현을 드러내는 이름은 피하라
- 가능하다면 표준 명명법을 사용하라
- 명확한 이름
- 긴 범위는 긴 이름을 사용하라
- 인코딩을 피하라
- 이름으로 부수 효과를 설명하라
테스트
- 불충분한 테스트
- 테스트 케이스가 확인하지 않는 조건이나 검증하지 않는 계산이 있다면 그 테스트는 불완전하다
- 커버리지 도구를 사용하라
- 테스트가 빠뜨리는 공백을 알려준다
- 사소한 테스트를 건너뛰지 마라
- 무시한 테스트는 모호함을 뜻한다
- 선택 기준은 모호함이 존재하는 테스트 케이스가 컴파일이 가능한지 불가능한지에 달려있다
- 경계 조건을 테스트하라
- 버그 주변은 철저히 테스트하라
- 실패 패턴을 살펴라
- 테스트 커버리지 패턴을 살펴라
- 테스트는 빨라야 한다
'3-2기 스터디 > 클린코드 독서' 카테고리의 다른 글
[6주차] 15~16장 정리 (0) | 2022.05.22 |
---|---|
[5주차] 14장 정리 (0) | 2022.05.17 |
[4주차] 클린코드 11~13장 정리 (0) | 2022.05.17 |
[3주차] 클린코드 7~10장 정리 (0) | 2022.04.15 |
[2주차] 클린코드 4~6장 정리 (0) | 2022.04.06 |
댓글