CleanCode
책 : Clean Code, 읽기 좋은 코드가 좋은 코드다 / 강의 : 클린코드 - 박재호
깨끗한 코드
-
소프트웨어 반감기 : 소프트웨어는 어쨋든 바뀌게 된다 → 이걸 어떻게 내재화 하고 저항성을 올릴지가 관건이다
-
한 번 나쁜 코드가 작성되면 막기가 힘들다
-
코딩은 정원 가까기에 가깝다. 자주 바뀌고 문제가 생기면 이를 격리 후 조치해야 하기 때문이다
-
리팩터링은 밖으로 들어나는 결과는 유지 한 채 내부 구조만 바꾸는 것이다(기능 추가가 아니다)
※ 가독성의 기본 정리 : 다른 사람이 그것을 이해하는 데 들이는 시간을 최소화
항상 일관성 : 모든 변수, 함수, RestAPI까지 일관성을 유지해야 한다 → 다르다면 왜 다른 지를 고민하게 된다.
특정 목적을 달성하는 방법은 하나만 제공
[ 깃 커밋 ]
Write a caption
깃 커밋을 하는 과정에서 위와같이 앞에 동사 원형을 붙인 상태로 시작해야 한다.
- 기능 하나에 하나의 커밋으로 하는게 가장 좋다.
위의 이미지에는 기능 3가지를 묶어서 하나의 커밋으로 때린 것을 볼 수 있다. 이런식으로 작성하면 안된다.
위의 이미지는 프론트엔드의 기능을 구현한 것으로 묶어 두었기 때문에 좋은 커밋이다.
- srp를 지키기위해 why를 적어라
[ 이름(변수, 함수) ]
변수 : 변수를 덜 사용하고 최대한 가볍게 만들어 가독성을 높인다
function getImages() {}
보다는
인터넷에서 가져오는 것이라면 fetchImages() 가 더 의미있는 이름
var tmp
var retval
도 동일하게 보편적이라서 사용을 지양한다
RestAPI 명명법
GET -> 보통 읽기
POST -> 보통 쓰기
PUT -> 보통 업데이트
DELETE -> 보통 삭제
function timeout(delay) {} // X
function timeout(delaySecs) {} // O
function timeout(delayMs) {} // O
function fileSizeLimitCheck(size) // X
function fileSizeLimitCheck(sizeMb) // O
function fileSizeLimitCheck(sizeKb) // O
변수의 의미를 제대로 이해하는 것이 중요하다면 그 의미를 드러내는 정보를 변수의 이름에 포함시켜야 한다.
// 평문인 비밀번호
const password = .. // X
const plainTextPassword = .. // O
// url encode 된 data
const data = .. // X
const dataUrlEnc = .. // O
-
상한/하한 : min, max 접두
-
경계를 포함 : first, last 접두
-
경계의 시작만 포함하고 끝은 포함하지 않을 때 : begin, end
-
불리언의 경우 : is, has
-
get으로 시작되는 메소드는 내부 멤버를 반환한다고 관행적으로 생각함
[ 미학 ]
눈을 편하게 해주는 규칙들 → 비슷하거나 비슷하게 묶거나
서로 연관된 코드를 블록으로 묶기
Class Sever {
// 핸들러
viewComment()
createComment()
updateComment()
replyComment()
// 질의 / 응답 유틸리티
commentOK()
commentNotFound()
// 데이터베이스 헬퍼
openDatabase()
closeDatabase()
}
[ 주석 ]
주석 없이도 이해하도록 명명을 잘하는게 가장 좋지만 그게 아니라면 주석 달기
- 코드에서 빠르게 유추할 수 있는 내용은 주석으로 달지 말라. → 읽기 쉬운 코드 만들기
- 나쁜 이름에 주석을 달지 마라 - 대신 이름을 고쳐라
- 주석으로 안 좋은 코드인 이유를 설명해라
- (오히려 잘못된 코드일수록 주석을 달아야하는데 숨기고 싶은 마음에 주석을 작성 안하는 것은 오히려 더 안 좋은 코드로 만드는 것인 것 같다.)
- 큰 덩어리에 요약 주석 을 달아라
# 고객이 자신을 위해서 구입한 항목을 모두 찾는다.
for customer_id in all_customers:
for sale in all_sales[customer_id].sales:
if sale.recipient == customer_id:
...
def GenerateUserReport():
# 이 사용자를 위한 lock을 얻는다
...
# 데이터베이스에서 사용자의 정보를 읽는다
...
# 정보를 파일에 작성한다
...
# 사용자를 위한 lock을 되돌려 넣는다.
- 주석의 의미 부여하기 → 사실상 완벽한 코드가 아니면 달 일이 많다
|
|
| TODO: |
아직 하지 않은 일 |
| FIXME: |
오동작을 일으킨다고 알려진 코드 |
| HACK: |
아름답지 않은 해결책 |
| XXX: |
위험! 여기 큰 문제가 있다 |
| TextMate |
ESC |
이와같이 주석을 달면 Visual Studio의 작업 목록에서 내용을 볼 수 있다.
- 코너케이스를 설명해주는 입/출력 예를 작성해 두어라
/*
ex 2022.08.20.
*/
export function momentL(value: string | Date) {
return moment(value).locale('ko').format('L');
}
이렇게 해야 왜 format을 썼는지 알 수 있다.