목표
클린 코드 책에서 제시한 클린 코드 규칙을 정리해보자.
목차
- 주석
- 환경
- 함수
- 일반
- 자바
- 이름
- 테스트
- 읽어 보면 좋은 책들
💡 프로그래밍은 과학보다 공예에 가깝다는 사실이다. 깨끗한 코드를 짜려면 먼저 지저분한 코드를 짠 뒤에 정리해야 한다.
💡 실용적인 관점에서 타협한다. 여러가지 규칙에 극단적으로 심취해 클래스와 메서드를 무수하게 만들지 말라. 결국 좋은 코드를 만드는 이유는 생산성을 올리기 위한 것이다.
주석
주석은 코드와 설계에 기술적인 설명을 부연하는 수단이다. 안 좋은 코드를 주석으로 부연설명하려 하지 말고 코드를 개선해라.
- 일반적으로 작성자. 최종 수정일, SPR 번호 같은 메타 정보만 주석으로 넣는다.
- 쓸모 없어질 주석은 달지 않는 편이 좋다.
- 주석으로 처리된 코드는 즉각 지워라.
환경
- 하나의 명령으로 전체를 체크아웃해서 한 명령으로 빌드할 수 있어야 한다.
- 모든 단위 테스트는 한 명령으로 돌려야 한다.
함수
- 함수 인수 개수는 적을수록 좋다.
- 출력인수는 사용하지 마라. 함수에서 상태를 변경해야 한다면 함수가 속한 객체의 상태를 변경한다.
- 플래그 인수를 사용하는 것은 함수가 여러 기능을 수행한다는 증거다. 피해라.
- 아무도 호출하지 않는 함수는 삭제한다.
일반
- 소스 파일 하나에 언어 하나만 사용하는 방식이 가장 좋다.
- 당연한 동작을 구현하라. 코드를 읽거나 사용하는 사람이 직관적으로 함수 기능을 예상할 수 있어야 한다.
- 모든 경게 조건을 찾아내고, 모든 경계 조건을 테스트하는 테스트 케이스를 작성하라.
- 추상화로 중복을 정리해라. 구현이 빨라지고 오류가 적어진다.
- 복붙한 코드는 간단한 함수로 교체한다.
- 조건을 확인하는 중복은 다형성으로 대체한다.
- 유사한 알고리즘은 TEMPLATE METHOD 패턴이나 STRATEGY 패턴으로 중복 제거한다.
- 디자인 패턴은 대다수가 중복을 제거하는 잘 알려진 방법이다.
- 추상화로 개념을 분리할 때는 철저해야 한다. 저차원 개념은 파생 클래스에 넣고, 모든 고차원 개념은 기초 클래스에 넣는다.
- 결합도는 낮추고 응집도는 높인다. 잘 정의된 모듈은 인터페이스가 아주 작다. 클래스가 제공하는 메서드가 작을수록, 함수가 아는 변수 수도 작을수록 좋다.
- 변수와 함수는 사용되는 위치에 가깝게 정의한다. 지역 변수는 처음으로 사용하기 직전에 선언하며 수직으로 가까운 곳에 위치한다. 비공개 함수는 처음으로 호출한 직후에 정의한다.
- 어떤 개념을 특정 방식으로 구현했다면 유사한 개념도 같은 방식으로 구현한다. 최소 놀람의 원칙
- 서로 무관한 개념은 인위적으로 결합하지 않는다.
- 다른 클래스의 변수와 함수에 관심을 가지면 안된다. 하지만 수정이 객체 지향 설계의 여러 원칙을 위반한다면 어느 정도의 욕심은 허용한다.
- 선택자 인수는 큰 함수를 작은 함수 여럿으로 쪼개지 않으려는 게으름의 소신이다.
- 코드를 배치하는 위치는 최소 놀람의 원칙을 기반으로 한다.
- 함수를 재정의할 가능성이 존재한다면 그 함수는 static으로 선언하면 안된다.
- 서술적 변수를 사용하고, 이름과 기능이 일치하는 함수를 사용한다.
- 알고리즘이 올바르다는 사실을 확인하고 이해하려면 기능이 빤히 보일 정도로 함수를 깔끔하고 명확하게 재구성해야 한다.
- 한 모듈이 다른 모듈에 의존한다면 물리적인 의존성도 있어야 한다.
- if, switch 문보다 다형성을 사용하라. 선택 유형 하나에는 조건문을 한번만 허용해라.
- 조건을 함수로 캡슐화해라.
- 부정 조건보다 긍정 조건을 사용하라.
- 함수는 한 가지만 해야 한다.
- 시간적인 결합을 드러내기 위해 함수 인수를 적절히 배치하여 함수 호출 순서를 명백히 드러낸다.
- 함수 내 모든 문장은 추상화 수준이 동일해야 한다. 그 추상화 수준은 함수 이름이 의미하는 작업보다 한 단계만 낮아야 한다.
- 설정 정보는 최상위 단계에 둬라.
- 추이적 탐색을 피하라. 디미터의 법칙을 적용하라.
자바
- 긴 import 대신 와일드 카드를 사용하라. import package.*;
- 상수는 상속하지 않는다. 대신 static import를 사용하라.
- 상수 말고 Enum을 사용해라. int보다 훨씬 유연하고 서술적인 강력한 도구이다.
이름
- 서술적인 이름을 사용하라. 소프트웨어 가독성의 90%는 이름이 결정한다.
- 적절한 추상화 수준에서 이름을 선택하라.
- 가능하다면 표준 명명법을 사용하라.
- 함수나 변수의 목적을 명확히 밝히는 이름을 선택하라.
- 긴 범위는 긴 이름을 사용하라.
- 인코딩을 피하라. 접두어를 사용하지 말고 헝가리안 표기법을 피하라.
- 이름으로 부수 효과를 설명하라.
테스트
- 테스트 케이스가 확인하지 않는 조건이나 검증하지 않는 계산이 있다면 그 테스트는 불완전하다.
- 커버리지 도구를 사용하라.
- 결계 조건은 각별히 신경 써서 테스트한다.
- 버그 주변은 철저히 테스트한다. 버그는 서로 모이는 경향이 있다.
- 실패 패턴을 살펴라. 테스트 케이스가 실패하는 패턴으로 문제를 진단할 수 있다.
- 테스트 커버리지 패턴을 살펴라. 실패하는 테스트 케이스의 실패 원인이 드러난다.
- 테스트는 빨라야 한다.
읽어 보면 좋은 책들
Design Pattern
- Head First Design Patterns
- Gang of Four Design Patterns
Unit Test
- Effective Unit Testing
Java
- 자바 8 인 액션
- 이펙티브 자바 Effective Java 3/E
리팩터링
- Refactoring: Improving the Design of Existing Code
객체 지향 설계
- 오브젝트: 코드로 이해하는 객체지향 설계
클린 코드 스터디는 이상으로 마무리합니다.
다들 수고 많으셨습니다! 👏👏
'Group Study (2021-2022) > Clean Code' 카테고리의 다른 글
[클린코드 북리뷰 스터디] 7주차 - 점진적인 개선, Junit 들여다보기, SerialDate 리팩터링 (0) | 2022.07.14 |
---|---|
[클린코드 북리뷰 스터디] 6주차 - 창발성과 동시성 (0) | 2022.07.01 |
[클린코드 북리뷰 스터디] 5주차 - 클래스와 시스템 (0) | 2022.06.26 |
[클린코드 북리뷰 스터디] 4주차 - 경계와 단위 테스트 (0) | 2022.06.20 |
[클린코드 북리뷰 스터디] 2주차 - 주석, 형식 맞추기 (0) | 2022.05.20 |