본문 바로가기

프로그램

Clean Code

Clean Code

1. 깨끗한 코드

  • 깨끗한 코드는 한가지에 집중한다.
  • 각 함수와 클래스와 모듈은 주변 상황에 현혹 되거나 오염되지 않은 채 한 길만 걷는다.
  • 깨끗한 코드는 주의 깊게 작성한 코드다. 누군가 시간을 들여 깔끔하고 단정하게 정리한 코드다. 세세한 사항까지 꼼꼼하게 신경 쓴 코드다. 주의를 기울인 코드다.
  • 보이스카우트 규칙
    • 체크아웃할 때보다 더 깨끗한 코드를 체크인한다면 코드는 절대 나빠지지 않는다.
    • 한꺼번에 많은 시간과 노력을 투자해 코드를 정리할 필요가 없다.
  • 캠프장은 처음 왔을 때보다 더 깨끗하게 해놓고 떠나라!

2. 의미 있는 이름

  • 의도를 분명히 밝혀라.
  • 그릇된 정보를 피하라.
  • 의미 있게 구분하라.
  • 발음하기 쉬운 이름을 사용하라.
  • 검색하기 쉬운 이름을 사용하라.
  • 인코딩을 피하라.
  • 자신의 기억력을 자랑하지 마라.
  • 기발한 이름은 피하라
  • 한 개념에 한 단어를 사용하라.
    • 추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다.
    • 나쁜예 : fetch, retrieve, get
  • 말장난을 하지 마라 (맥락을 고려하여 사용하라)
    • add : 두개를 더한다.
    • append : 집합에 값 하나를 추가한다.
  • 해법 영역에서 가져온 이름을 사용하라.
    • Factory 패턴 : VehicleFactory
  • 문제 영역에서 가져운 이름을 사용하라.
    • 적절한 용어가 없을 경우 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져온다.
  • 의미 있는 맥락을 추가하라
  • 불필요한 맥락을 없애라.

3. 함수

  • 작게 만들어라.
  • 한 가지만 해라!
  • 함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다.
  • 서술적인 이름을 사용하라.
    • 함수가 하는 일을 좀 더 잘 표현해야 좋은 이름이다.
  • 함수 인수
    • 동사와 키워드
      • 동사 : 함수와 인수가 동사/명사 쌍을 이룬다.
      • 키워드 : 함수 이름에 인수 이름을 넣는다.
  • 부수 효과를 일으키지 마라.
    • 남 몰래 다른짓을 해선 안된다.
  • 명령과 조회를 분리하라.
  • 오류 코드보다 예외를 사용하라.

4. 주석

  • 코드로 의도를 표현하지 못해 실패를 만회하기 위해 주석을 사용한다. 우리에게 프로그래밍 언어를 치밀하게 사용해 의도를 표현할 능력이 있다면 주석은 거의 필요하지 않다.
  • 코드로 의도를 표현하라.
  • 좋은 주석
    • 법적인 주석
    • 정보를 제공하는 주석
    • 의도를 설명하는 주석
    • 의미를 명료하게 밝히는 주석
    • 결과를 경고하는 주석
    • TODO 주석
    • 중요성을 강조하는 주석

5. 형식 맞추기

  • 형식을 맞추는 목적
    • 코드 형식은 의사소통의 일환이다.
  • 적절한 행 길이를 유지하라.
    • 일반적으로 200줄 미만.
  • 신문 기사처럼 작성하라.
    • 이름은 간단하면서도 설명이 가능하게 짓는다.
    • 소스 파일의 첫 부분은 고차원 개념과 알고리즘을 설명하고 아래로 내려갈수록 의도를 세세하게 묘사한다.
  • 개념은 빈 행으로 분리하라.
  • 세로 밀집도는 연관성을 의미한다.
  • 변수 선언은 사용위치에 최대한 가까이 선언한다.
  • 인스턴스 변수는 클래스 맨 처음에 선언한다.
  • 종속함수
    • 다른 함수를 호출한다면 두 함수는 세로로 가까이에 위치 시킨다.
    • 호출하는 함수는 호출되는 함수보다 먼저 배치한다.
  • 개념적으로 유사한 코드는 가까이에 배치한다.
  • 가로 길이 80자 이내.
  • 팀은 한 가지 규칙에 합의해야 하고, 팀원은 그 규칙을 따라야 한다.

6. 객체와 자료구조

  • 객체는 동작을 공개하고 자료를 숨긴다.
  • 자료구조는 자료를 공개하고 별다른 함수를 제공하지 않는다.
    • 비즈니스 규칙을 담지 않는다.

7. 오류처리

  • 오류코드 보다 예외를 사용하라
  • null 을 반환하지 마라
  • null 을 전송하지 마라

8. 경계

  • 외부라이브러니나 컴포넌트는 Adapter 패턴을 사용하여 우리가 원하는 인터페이스로 변환하라.

9. 단위테스트

  • 테스트 함수 하나는 개념 하나만 테스트 하라.
  • 개념 하나당 assert 문을 최소로 줄여라.
  • F.I.R.S.T
    • F (Fast) : 테스트는 빨리 돌아야 한다.
    • I (Independent) : 각 테스트는 서로 의존하면 안 된다.
    • R (Repeatable) : 어떤 환경에서도 반복 가능해야 한다.
    • S (Self-Validating) : 부울 (bool) 값으로 결과를 내야 한다.
    • T (Timely) : 적시에 작성해야 한다.

10. 클래스

  • 큰 클래스 몇개가 아니라 작은 클래스 여럿으로 이뤄진 시스템이 더 바람직 하다.
    • SRP 를 지켰기 때문.
  • 클래스는 인스턴스 변수 수가 작아야 한다. 인스턴스 변수를 메서드 마다 사용하는 클래스는 응집도가 가장 높다.
  • 클래스가 응집력을 잃는다면 쪼개라.

11. 창발성

남이 모르거나 하지 아니한 것을 처음으로 또는 새롭게 밝혀내거나 이루는 일.

  • 모든 테스트를 실행한다.
  • 중복을 없앤다.
  • 프로그래머의 의도를 표현한다.
  • 클래스와 메서드 수를 최소로 줄인다.

12. 동시성

  • SRP 를 준수한다.
  • 동시성 오류를 일으키는 잠정적인 원인을 철저히 이해한다.
  • 사용하는 라이브러리와 기본 알고리즘을 이해한다.
  • 초반에 드러나지 않는 문제는 일회성으로 치부하지 마라.

'프로그램' 카테고리의 다른 글

Clean Architecture  (2) 2024.02.20