Clean Code

임성준·2022년 10월 12일
0
post-thumbnail

Clean Code

이 글은 본인이 공부한 Clean Code 내용을 주기적으로 리마인드하기 위한 글이다. 그렇기에 글을 읽는 다른 독자들에게는 글을 이해하기 위한 자세한 설명이 다소 부족할 수 있다.

1️⃣  변수

  • 의미있는 변수 이름을 사용
  • 발음할 수 있는 변수 이름을 사용
  • 동일한 유형의 변수는 동일한 단어를 사용
  • 검색할 수 있는 이름을 사용
  • 의도를 나타내는 변수를 사용
  • 암시하는 이름은 사용 ❎  ➡️   명시적 이름 사용
  • 불필요한 문맥은 추가 ❎
  • short circuiting이나 조건문 대신 기본 매개변수를 사용
  • 의도를 알려주기 위해 enum을 사용

2️⃣  함수

  • 함수의 매개변수는 2개 혹은 그 이하가 이상적이다
  • 함수는 한 가지만 해야한다
  • 함수가 무엇을 하는지 알 수 있도록 함수 이름을지어야 한다
  • 함수는 단일 행동을 추상화해야 한다
  • 중복된 코드를 제거
  • Object.assign 혹은 구조 분해를 사용해서 기본 객체를 만들어야 한다
  • 함수 매개변수로 플래그를 사용 ❎
  • 사이드 이펙트를 피해야 한다
    1. 함수는 값을 가져와서 다른 값을 반환하는 것 이외에 다른 것(전역 변수 조작 등)을 할 경우 사이 드 이펙트를 발생시킬 수 있다.
    2. 참조 값을 수정 사용 시, 원본 자체를 변경하기보다는 원본을 복사한 후 수정해서 사용하는 것이 좋다.
  • 전역 함수를 작성 ❎
  • 명령형 프로그래밍보다 함수형 프로그래밍을 지향
  • 조건문을 캡슐화
  • 부정 조건문 ❎
  • 조건문 지양
  • 타입 체킹을 피해야 한다.
  • 필요 이상으로 최적화 ❎
  • 필요하지 않는 코드는 제거
  • iterator와 generator를 사용

3️⃣   객체와 자료구조

  • getter와 setter를 사용
  • private/protected 멤버를 갖는 객체를 생성
  • 불변성을 선호 (readonly)
  • 리터럴 값을 위해 const assertions를 사용
  • 타입 vs 인터페이스
    1. 합집합 또는 교집합이 필요할 때 타입을 사용
    1. extends 또는 implements가 필요할 때 인터페이스를 사용

4️⃣   클래스

  • 클래스는 작아야 한다
  • 높은 응집도와 낮은 결합도
  • 상속(inheritance)보다 조합(composition)을 사용
  • 메소드 체이닝을 사용
  • SOLID
    1. 단일 책임 원칙 (SRP)
    1. 개방 폐쇄 원칙 (OCP)
    2. 리스코프 치환 원칙 (LSP)
    3. 인터페이스 분리 원칙 (ISP)
    4. 의존성 역전 원칙 (DIP)

5️⃣   TEST

TDD의 세 가지 법칙

1. 실패하는 단위 테스트를 작성하기 전에는 실제 코드를 작성 ❎
2. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성
3. 실패하는 단위 테스트를 통과할 정도로만 실제 코드를 작성

F.I.R.S.T 규칙

**Fast : ** 테스트는 빈번하게 실행되므로 빨라야 한다.
**Independent : ** 테스트는 서로 종속적이지 않으며, 독립적으로 실행하든지 순서 상관없이 모두 실행하든지 동일한 결과가 나와야 한다.

Repeatable : 테스트는 어떤 환경에서든 반복될 수 있습니다. 테스트가 실패하는데에 이유가 없어야 한다.
Self-Validating : 테스트는 통과 혹은 실패로 답해야 한다. 테스트가 통과되었다면 로그 파일을 보며 비교할 필요는 없다.
Timely : 단위 테스트는 실제 코드를 작성하기 전에 작성해야 한다. 실제 코드를 작성한 후에 테스트를 작성한다면, 테스트를 작성하는 것이 너무 고단하게 느껴질 것이다.

  • 테스트의 이름은 테스트의 의도가 드러나야 합니다
  • 동시성 - async / await
    async / await 구문을 사용하면 연결된 프로미스 구문보다 훨씬 더 명료하고 이해하기 쉬운 코드를 작성할 수 있다.

6️⃣   에러 처리

  • throw 또는 reject 구문에서 항상 Error 타입을 사용
  • catch 절에서 에러 처리 부분을 비워두기 ❎
  • 요청이 거부된 프로미스 객체 무시 ❎

7️⃣   서식

  • 일관적으로 대소문자를 사용
  • 함수 호출자와 피호출자를 가깝게 위치
  • import 구문을 특정 순서대로 정리
  • 타입스크립트 앨리어스를 사용

8️⃣   주석

  • 주석 대신에 자체적으로 설명 가능한 코드를 작성
  • 코드자체 주석 처리 ❎
  • 일기 같은 주석 ❎
  • 코드의 위치를 설명하는 주석 ❎
  • TODO 주석 - 추후에 개선을 위해 코드에 메모를 남겨야할 때

참조 :

profile
오늘도 공부 📖🌙

0개의 댓글