좋은 코드란?
안녕하세요
Python을 활용하여, Airflow, Streamlit, Spark에서 코드를 구현하면서 문득 어떻게 코드를 짜는 것이 옳은 방향인가 대한 생각이 깊어져 찾아보게 되었습니다.
좋은 코드란 무엇인가?
- Read
- Duplicate
- Test
읽기 쉬운 코드?
- 주석을 쓰지 않고, 남이 봐도 한번에 읽히는 코드
- 주석은 메타데이터로서, 실제 동작과 불일치하는 경우 혼란을 야기 ( 어쩔 수 없는 경우에만 사용 )
- 읽기만 쉽다면? 의미만 전달하는 것이 아닌 프로세스를 이해하는것도 포함
중복이 없는 코드?
- 재사용이 높은 코드들을 수정 시 번거로움 방지
의존성
적게하여 각각 다른 기능 구현- 그렇다면 시간이 지나면서 분리되는 코드들을 어떻게 해야 할까?
테스트가 용이한 코드?
- 테스트를 통하여 예측 가능한 장애 방지
상위 목표
좋지 않은 코드를 줄인다.
좋지 않은 코드가 언제 생산되고 어떻게 방지할 수 있을까?
- Dead Code = 어디에 쓰이는지도 모르고, 삭제하기에는 위험 리스크가 있는 코드
- 동작하는 곳과 정의하는 코드 사이의 거리가 멀어진 경우
- 순수하지 않은 함수 = 함수 외부의 값을 통하여 동작하는 경우 → 함수의 입출력만 확인하여 내부를 수정할 수 없다면 유지보수 비용 발생
- 임시 방편 코드
- 추출이 아닌 추상화
- 삭제하기 쉬운 코드와 삭제하기 어려운 코드의 분리
일관성
있는 코드 = 합의된 규칙을 기반으로 코드를 구성한다.- hooks과 관련되었다면, use-* prefix를 사용한다.
1 2 3 4 5 6 7 8 9 10 11
// Case 1. // prefix: handle // target: button // action: click buttonClick() // Case 2. // prefix: on // action: click // target: button onClickButton()
b. Directory = Component를 “어디에 분리할지”
1 2 3 4 5 6 7 8 9
src ├── api ├── components ├── hooks ├── model ├── pages │ ├── contract │ └── docs └── utils
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
src ├── @shared │ ├── components │ ├── hooks │ ├── models │ └── utils ├── contract │ ├── components │ ├── hooks │ ├── models │ ├── utils │ └── index.ts ├── docs │ ├── components │ ├── hooks │ ├── models │ ├── utils │ └── index.ts └── App.tsx
확장성
있는 코드 = 확장이 어려운 코드는 내부에서 많은 변경이 발생하며, 코드를 어렵게 만든다.