Group Study (2021-2022)/Clean Code

[클린코드 북리뷰 스터디] 8주차 - 냄새와 휴리스틱

민휘 2022. 7. 16. 12:37

목표

클린 코드 책에서 제시한 클린 코드 규칙을 정리해보자.

 

목차

  1. 주석
  2. 환경
  3. 함수
  4. 일반
  5. 자바
  6. 이름
  7. 테스트
  8. 읽어 보면 좋은 책들

 

💡 프로그래밍은 과학보다 공예에 가깝다는 사실이다. 깨끗한 코드를 짜려면 먼저 지저분한 코드를 짠 뒤에 정리해야 한다.
💡 실용적인 관점에서 타협한다. 여러가지 규칙에 극단적으로 심취해 클래스와 메서드를 무수하게 만들지 말라. 결국 좋은 코드를 만드는 이유는 생산성을 올리기 위한 것이다.

 

주석

주석은 코드와 설계에 기술적인 설명을 부연하는 수단이다. 안 좋은 코드를 주석으로 부연설명하려 하지 말고 코드를 개선해라.

  1. 일반적으로 작성자. 최종 수정일, SPR 번호 같은 메타 정보만 주석으로 넣는다.
  2. 쓸모 없어질 주석은 달지 않는 편이 좋다.
  3. 주석으로 처리된 코드는 즉각 지워라.

 

환경

  1. 하나의 명령으로 전체를 체크아웃해서 한 명령으로 빌드할 수 있어야 한다.
  2. 모든 단위 테스트는 한 명령으로 돌려야 한다.

 

함수

  1. 함수 인수 개수는 적을수록 좋다.
  2. 출력인수는 사용하지 마라. 함수에서 상태를 변경해야 한다면 함수가 속한 객체의 상태를 변경한다.
  3. 플래그 인수를 사용하는 것은 함수가 여러 기능을 수행한다는 증거다. 피해라.
  4. 아무도 호출하지 않는 함수는 삭제한다.

 

일반

  1. 소스 파일 하나에 언어 하나만 사용하는 방식이 가장 좋다.
  2. 당연한 동작을 구현하라. 코드를 읽거나 사용하는 사람이 직관적으로 함수 기능을 예상할 수 있어야 한다.
  3. 모든 경게 조건을 찾아내고, 모든 경계 조건을 테스트하는 테스트 케이스를 작성하라.
  4. 추상화로 중복을 정리해라. 구현이 빨라지고 오류가 적어진다.
    1. 복붙한 코드는 간단한 함수로 교체한다.
    2. 조건을 확인하는 중복은 다형성으로 대체한다.
    3. 유사한 알고리즘은 TEMPLATE METHOD 패턴이나 STRATEGY 패턴으로 중복 제거한다.
    4. 디자인 패턴은 대다수가 중복을 제거하는 잘 알려진 방법이다.
  5. 추상화로 개념을 분리할 때는 철저해야 한다. 저차원 개념은 파생 클래스에 넣고, 모든 고차원 개념은 기초 클래스에 넣는다.
  6. 결합도는 낮추고 응집도는 높인다. 잘 정의된 모듈은 인터페이스가 아주 작다. 클래스가 제공하는 메서드가 작을수록, 함수가 아는 변수 수도 작을수록 좋다.
  7. 변수와 함수는 사용되는 위치에 가깝게 정의한다. 지역 변수는 처음으로 사용하기 직전에 선언하며 수직으로 가까운 곳에 위치한다. 비공개 함수는 처음으로 호출한 직후에 정의한다.
  8. 어떤 개념을 특정 방식으로 구현했다면 유사한 개념도 같은 방식으로 구현한다. 최소 놀람의 원칙
  9. 서로 무관한 개념은 인위적으로 결합하지 않는다.
  10. 다른 클래스의 변수와 함수에 관심을 가지면 안된다. 하지만 수정이 객체 지향 설계의 여러 원칙을 위반한다면 어느 정도의 욕심은 허용한다.
  11. 선택자 인수는 큰 함수를 작은 함수 여럿으로 쪼개지 않으려는 게으름의 소신이다.
  12. 코드를 배치하는 위치는 최소 놀람의 원칙을 기반으로 한다.
  13. 함수를 재정의할 가능성이 존재한다면 그 함수는 static으로 선언하면 안된다.
  14. 서술적 변수를 사용하고, 이름과 기능이 일치하는 함수를 사용한다.
  15. 알고리즘이 올바르다는 사실을 확인하고 이해하려면 기능이 빤히 보일 정도로 함수를 깔끔하고 명확하게 재구성해야 한다.
  16. 한 모듈이 다른 모듈에 의존한다면 물리적인 의존성도 있어야 한다.
  17. if, switch 문보다 다형성을 사용하라. 선택 유형 하나에는 조건문을 한번만 허용해라.
  18. 조건을 함수로 캡슐화해라.
  19. 부정 조건보다 긍정 조건을 사용하라.
  20. 함수는 한 가지만 해야 한다.
  21. 시간적인 결합을 드러내기 위해 함수 인수를 적절히 배치하여 함수 호출 순서를 명백히 드러낸다.
  22. 함수 내 모든 문장은 추상화 수준이 동일해야 한다. 그 추상화 수준은 함수 이름이 의미하는 작업보다 한 단계만 낮아야 한다.
  23. 설정 정보는 최상위 단계에 둬라.
  24. 추이적 탐색을 피하라. 디미터의 법칙을 적용하라.

 

자바

  1. 긴 import 대신 와일드 카드를 사용하라. import package.*;
  2. 상수는 상속하지 않는다. 대신 static import를 사용하라.
  3. 상수 말고 Enum을 사용해라. int보다 훨씬 유연하고 서술적인 강력한 도구이다.

 

이름

  1. 서술적인 이름을 사용하라. 소프트웨어 가독성의 90%는 이름이 결정한다.
  2. 적절한 추상화 수준에서 이름을 선택하라.
  3. 가능하다면 표준 명명법을 사용하라.
  4. 함수나 변수의 목적을 명확히 밝히는 이름을 선택하라.
  5. 긴 범위는 긴 이름을 사용하라.
  6. 인코딩을 피하라. 접두어를 사용하지 말고 헝가리안 표기법을 피하라.
  7. 이름으로 부수 효과를 설명하라.

 

테스트

  1. 테스트 케이스가 확인하지 않는 조건이나 검증하지 않는 계산이 있다면 그 테스트는 불완전하다.
  2. 커버리지 도구를 사용하라.
  3. 결계 조건은 각별히 신경 써서 테스트한다.
  4. 버그 주변은 철저히 테스트한다. 버그는 서로 모이는 경향이 있다.
  5. 실패 패턴을 살펴라. 테스트 케이스가 실패하는 패턴으로 문제를 진단할 수 있다.
  6. 테스트 커버리지 패턴을 살펴라. 실패하는 테스트 케이스의 실패 원인이 드러난다.
  7. 테스트는 빨라야 한다.

 

읽어 보면 좋은 책들

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

객체 지향 설계

  • 오브젝트: 코드로 이해하는 객체지향 설계

 


 

클린 코드 스터디는 이상으로 마무리합니다.

다들 수고 많으셨습니다! 👏👏