• 하단 토스 컨퍼런스 내용

clean code

  • 개발할 때 병목이 되고 유지보수가 오래걸리며, 기능 추가가 불가능하거나, 성능이 안좋을 수 있는 코드는 다음과 같다.
  1. 흐름 파악이 어렵고
  2. 도메인 맥락 표현이 안되어
  3. 동료에게 물어봐야 알 수 있는 코드
  • 읽기 좋은 깔끔한 코드는 코드 리뷰의 시간을 단축하며, 버그가 났을 때 디버깅 시간도 단축시킨다.
  • 클린코드의 의의=유지보수(코드파악, 디버깅, 리뷰) 시간(시간=자원=돈)의 단축

나쁜 코드는

  1. 하나의 목적인 코드가 흩뿌려져 있는 경우
    • 다 떨어져 있어 나중에 기능을 추가할 때 스크롤을 위아래로 이동하며 미로찾기를 해야함
  2. 하나의 함수가 여러가지 일을 하고 있는 경우
    • 세부 구현을 모두 읽어야 함수의 역할을 알 수 있다.
    • 코드 추가 및 삭제도 시간이 걸림
  3. 함수의 세부 구현 단계가 제각각일 경우

큰 그림을 보며 리팩토링 하면

  1. 함수 세부 구현 단계 통일

  2. 하나의 목적인 코드는 뭉쳐두기

  3. 하나의 함수는 한가지만 하도록 쪼개기

⇒ 클린코드란 짧은 코드가 아닌 원하는 로직을 빠르게 찾을 수 있는 코드

원하는 로직을 빠르게 찾으려면

  1. 하나의 목적을 가진 코드가 흩뿌려지 있지 않을 수 있도록 응집도를 높여 뭉쳐야하고
  2. 함수가 여러가지 일을 할 때 단일 책임 원칙에 의거하여 쪼개줘아하며
  3. 함수의 세부 구현 단계가 제각각일 경우에는 추상화 단계를 조정하여 핵심 개념을 필요한 만큼만 노출해야한다.

응집도

  • 같은 목적의 코드는 뭉쳐둔다.
  • 커스텀훅을 통해서도 로직을 뭉칠 수 있지만

단, 커스텀 훅의 대표적인 안티패턴은

  • 커스텀훅의 통해 한군데로 로직을 뭉쳤다고 해도 훅 속에 로직이 가려지기 때문에 오히려 중요한 로직 파악이 어려워질 수 있다.
  • 복잡한 코드들을 하나의 hook 엔에 뭉쳐 넣는 경우

무엇을 뭉쳐야할까?

  • 당장 몰라도 되는 디테일
    • 숨겨두면 짧은 코드만 보고 빠르게 코드 파악이 가능해진다.
    • 코드 파악에 필수적인 핵심 정보는 오히려 뭉쳐두면 답답해진다. 이를 분리하면 여러 모듈을 넘나들며 흐름을 따라가야하는 참사가 발생
  • 남겨야할 핵심 데이터와 숨겨도 될 세부 구현을 나눈다.

선언적 프로그래밍

  • 핵심 데이터만 전달받고 세부 구현은 뭉쳐 숨겨두는 개발 스타일로 무엇을 하는 함수인지 빠른 이해가 가능하다.

명령형(절차적) 프로그래밍은 당신이 어떤 일을 어떻게 할 것인가에 관한 것이고,선언적 프로그래밍은 당신이 무엇을 할 것인가에 관한 것으로,

선언적 방식의 접근을 위해서는 명령형 방식으로’어떻게 접근하는가’에 관한 내용이 먼저 추상화 되어있어야 한다.

단일책임

  • 하나의 함수는 하나의 책임을 진다.
  • 중요 포인트가 모두 담겨있지 않은 함수명은 지양해야한다.
  • 한가지 일만 하는 명확한 이름의 함수
  • 한가지 일만 하는 기능성 컴포넌트
  • 도메인이 복잡하여 영어 이름을 길게 짓는게 오히려 복잡도를 높일 경우 한글 이름을 이용하도록 한다.

추상화

  • 로직에서 핵심 개념 뽑아내기
  • 컴포넌트를 추상화
  • 함수 추상화

얼마나 추상화 할것인가?

  • 정답은 없음 상황에 따라 추상화
  • 단, 확장성 및 유연성을 고려할것
  • 한 레벨의 코드 안에 추상화 수준이 섞여 있으면 전체적인 코드가 어느 수준으로 구체적으로 기술된지 파악할 수 없어 코드 파악이 어려워진다.
  • 추상화 단계를 비슷하게 정리하면 코드를 파악하기에 용이하다.

⇒ 사소하지만 일관성을 깨는 코드가 쌓이면 유지보수가 힘들어진다

처음 개발시 클린했던 코드가 새로 기능 추가시 더이상 클린하지 않아질 수 있으니 개발시 주의하자.

Ref

토스ㅣSLASH 21 - 실무에서 바로 쓰는 Frontend Clean Code