클린코드 ?
📕1장 깨끗한 코드
코드 해독시간이 길어짐에 따라 팀 생산성 저하 → 더 나쁜 코드 양산 → 결국 재설계 (실제 경험 있음)
르블랑의 법칙 : 나중은 결코 오지 않는다.
일정 / 요청사항 수정 등 핑계 x . 좋은코드 사수를 위해 정보 및 예상시간은 우리가 적극적으로 제공하자.
좋은코드를 짜는것이 결국 시간을 줄인다.
어떻게 좋은코드를 작성할까?
-
비야네 스트롭스트룹
- 논리는 간단해야한다.
- 의존성을 최대한 줄여야 유지보수가 쉬워진다.
- 철저한 오류처리
- 네이밍은 일관성있게 짜자
- 성능 최적화 / 메모리 누수
- 목적은 정확하게, 한가지에 집중하는 코드를 작성하자.
-
그래디 부치
- 가독성 중시, 설계자의 의도를 숨기지 않고 직접적으로 짜라.
-
데이브 토마스
- 다른사람도 고치기 쉬운 코드가 되어야 한다.
- 테스트 케이스가 있는 코드
- 큰 코드보다 작은 코드가 좋다.
-
론 제프리스
- 중복과 높은 표현력
- 한 기능만 수행하기
- 초반부터 간단한 추상화 고려
보이스카우트 규칙
시간이 지나도 깨끗한 코드를 유지해라.
⇒ 깨끗한 코드를 짜기 위한 방법은 반복적으로 나오고 있다. 중복을 피하고, 남이 봐도 직관적인 코드를 짜야하며 최대한 작은 단위로 코드를 설계하여 의존성을 줄이도록 하자!
📗 2장 의미있는 이름
-
의도를 분명히 밝혀라
- 주석이 필요할 정도의 네이밍이라면 의도를 제대로 표현하지 못한것이다.
-
그릇된 정보를 피해라.
-
의미있게 구분해라
- 동일한 범위 내 다른 두개념 등 연속된 숫자로 명명하지 말자. info / data 는 의미가 불분명하며 중복이 되기 쉬우므로, 비슷한 개념이 있다면 더 명확한 이름으로 짓도록 하자.
const internshipList = [...internData , internData]
const handleInternship = useCallback((e) => {
return internshipList.find((el)=> el.paymentPerMonth === e )
},[internshipList]}
vs
const internshipPaymentList = [...internPaymentData , internPaymentData]
const findInternWorkingSpecificDays = useCallback((PAY) => {
return internshipList.find((intern)=> intern.workDaysPerWeek === WORK_DAYS_PER_WEEK )
},[internshipList]}
-
발음하기 쉬운 이름을 사용해라
-
검색하기 쉬운 이름을 사용해라
- 여러곳에서 사용하는 단순 숫자, 알파벳일 경우 검색하기 쉬운 변수/상수 이름을 짓는것이 바람직하다.
<span>$10</span>
vs
const PAYMENT_PER_HOUR = 10
<span>${PAYMENT_PER_HOUR}</span>
-
인코딩을 피해라
- 헝가리식 표기법 : 컴퓨터 프로그래밍에서 변수 및 함수의 이름 인자 앞에 데이터 타입을 명시하는 코딩 규칙
- 멤버 변수 접두어 : 클래스 및 함수는 접두어가 필요 없을 정도로 작게 짜야 한다.
- 인터페이스 : ShapeFactoryImp vs IShapeFactoryImp
-
클래스 / 객체 이름 : 명사가 적합
-
메소드 이름 : 동사가 적합
-
한 개념에 한 단어를 사용해라
- 똑같은 기능을 하는 메소드 ( fetch / retrieve / get )를 각기 다른단어로, 다른곳에서 쓰게 된다면 찾기 힘들 뿐 아니라 일관성이 달라 다른 타입이라고 생각 할 수 있다.
ex) getAddress 를 썼다면 다른곳에서도 fetchUserProfile 이 아니라, getUserProfile 이런식으로 통일해서 만들어야 한다.
-
다른 개념에는 같은언어를 사용하지 않는다.
- 일관성을 고려하기 위해 다른 목적에 있는 메소드에도 같은이름을 붙인다면 말장난에 불과하다. 비슷하지만 맥락이 다르다면 다른 단어를 쓰는게 맞다.
ex) addNumber / addName ⇒ appendNumber / insertName
-
문제영역에서 가져온 이름을 사용하라
- 적절한 프로그래머 용어가 없다면 문제영역에서 가져온다.
-
의미있는 맥락을 추가해라
- 변수 / 메소드만 봤을때 어떠한 영역의 일부인지 알아채기 어려울 수 있으니 의미가 분명하도록 변수명을 짓도록 한다.
ex )
name, street, houseNumber, city, state, zipcode;
addrName, addrStreet, addrHouseNumber, addrCity, addrState, addrZipcode;
-
불필요한 맥락을 없애라
- 의미가 분명하다면 짧은이름이 좋다. 이름에는 불필요한 맥락을 추가하지 않는다.
📘 3장 함수
- 작게 만들어라
- if / while 문 안에 들어가는 블록은 한줄이 적당하다.
- 한가지만 해라
- 함수 당 추상화 수준은 하나로
- 위에서 아래로 내려가기 규칙 : 코드는 위에서 아래로 이야기처럼 읽혀야 좋다.
- 서술적인 이름을 사용하라.
- 코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행하면 깨끗한 코드이다.
- 같은 일관성 내, 길고 서술적인 이름 > 짧고 어려운 이름
- 함수 인수 : 이상적인 인수 개수는 0개. 3개이상은 가능한 피하는게 좋다.
1.
- 부수효과를 일으키지 마라