우리 모두는 대충 짠 프로그램이 돌아간다는 사실에 안도감을 느끼며 그래도 안 돌아가는 프로그램보다 돌아가는 쓰레기가 좋다고 스스로를 위로한 경험이 있다.
전부터 읽어야겠다고 한 클린코드를 읽기 시작했다.
취준 할 때는 책 내용을 일일히 정리했었는데 이제 그렇게 하는 것은 조금 무리가 있을 것 같아서 우선 학습을 한 후 내가 기록하고 싶은 내용 위주로만 기록을 남기기로 했다.
1장 : 깨끗한 코드
나쁜 코드는 생산성을 떨어트린다.
좋은 코드를 짜는 것은 프로그래머의 역할이다.
좋은 코드란 무엇인가?
- 한 가지에 집중
- 크기가 작아야 함
- 테스트를 통해 검증됨
- 단순명로하게 작성
- 다른 사람이 읽었을 때도 바로 이해할 수 있어야함
- 명쾌해야함
- 효율적이어야 함(속도, CPU 자원 등등)
- 중복이 없어야 함
- 보이스카우트 규칙: 캠프장은 처음 왔을 때보다 더 깨끗하게 해놓고 떠나라 -> 지속적인 개선을 통해 점점 더 깨끗한 코드로
2장 : 의미 있는 이름
- 의도를 분명하게 밝히는 이름
-존재 이유
-수행 기능
-사용 방법
- 그릇된 정보를 피해라
-널리 쓰이는 이름 사용x
-실제로 그 자료형이 아니라면 이름에 자료형 넣지 말 것 (ex. List가 아니라면 변수 이름에 list를 붙이지 말 것)
-흡사한 이름 여러개x
- 의미 있게 구분하라
-연속된 숫자를 붙이거나 불용어를 붙이는 식으로 이름붙이지 말 것
-읽는 사람이 명확하게 기능을 구분할 수 있는 이름을 붙일 것(ex. ProductInfo, ProductData 이런식의 이름을 붙여선 안됨)
- 발음하기 쉬운 이름을 사용할 것
-앞글자만 따겠다고 genymdhms 이딴 발음할 수 없는 이름 붙이지 말 것
- 검색하기 쉬운 이름을 사용할 것
-검색하기 어려운 짧은 이름(ex. int e1)은 로컬 변수에서만 사용
-범위가 커질수록 이름도 길게 붙이는 것이 검색할 때 빠르고 쉬움
- 인코딩을 피하라
- 자신의 기억력을 자랑하지 마라
-읽는 사람이 계속해서 머릿속으로 변수 이름을 생각하고 사용해야 한다면 나쁜 코드임 (ex. a, b가 이미 있으니 어떤 변수 이름을 c로 붙임 이런식으로 이름붙이지 말 것)
-변수 이름은 명료해야 한다.
- 클래스 이름
-클래스/객체 이름은 명사나 명사구로 사용
- 메서드 이름
-메서드 이름은 동사나 동사구로 사용
-접근자, 변경자, 조건자는 표준에 따라 get, set, is 접두사로 붙임
- 기발한 이름을 사용하지 말 것
-변수 이름으로 특정 문화권에서만 이해할 수 있는 농담같은거 붙이지 말 것
- 한 개념에 한 단어
-추상적인 개념 하나에 단어 하나를 선택하고 이를 유지할 것 (ex. 날짜를 가져오는 메서드를 getDate()라고 하기로 했으면 다른 모든 클래스에서도 날짜를 가져오는 메서드를 선언할 때 getDate()라고 이름 붙일 것)
- 해법 영역에서 가져온 이름 사용
-컴퓨터 공학에서 사용되는 용어로 이름 붙이기
- 문제 영역에서 가져온 이름 사용
-적절한 프로그래머 용어가 없다면 문제 영역에서 이름 가져오기
- 의미 있는 맥락 추가
- 불필요한 맥락은 없애라
3장 : 함수
- 작게 만들어라
-함수는 작을수록 좋다
- 함수는 한가지만 해야한다
-추상화 수준이 하나인 단계만 수행
-함수 내에서 의미 있는 또 다른 함수를 추출해낼 수 있다면 그 함수는 여러가지를 하는 것이므로 축소 필요
- 함수 당 추상화 수준은 하나로
-내려가기 규칙: 함수들은 위에서 아래로 내려가듯이 읽혀야 함, 추상화 수준이 한 번에 한 단계씩 낮아지도록 설계하기
- Switch 문
-추상 팩토리로 숨기기.. 되도록 사용x
- 서술적인 이름 사용
-길고 서술적인 이름이 짧고 어려운 이름보다 좋다
-이름은 일관성 있게 붙이기
- 함수 인수
-적을수록 좋다
-인수가 없는 것이 최선이며 차선은 인수가 한 개인 것, 인수 4개 이상은 사용하지 말 것
-많이 쓰는 단항 형식: 인수에 질문을 넘기는 경우, 인수를 변환해 결과를 반환하는 경우, 이벤트를 사용하는 경우
-플래그 인수: 사용하지 말 것
-이항 이상의 함수: 가능하면 단항 함수로 바꾸도록 노력해야 함, (x,y)좌표처럼 자연스럽고 납득 가능한 순서가 있는 경우에만 사용
-인수 객체: 인수 여러개를 객체로 묶기(ex. double x, double y -> Point center 이런식으로)
-인수 목록: 가변 인수도 마찬가지
-동사와 키워드 사용
- 부수 효과를 일으키지 마라
-함수 내에서 함수 이름에 명시되지 않은 다른 동작을 하지 말 것
-차라리 함수 내에서 일어나는 동작이 모두 표현되도록 이름을 아주 길게 붙이거나 함수를 조각조각 분해해서 여러개로 만드는 게 낫다
- 명령과 조회 분리
- 오류 코드보다 예외 사용
- try/catch블록 -> 복잡하고 추한 코드, 별도 함수로 뽑아낼 것
-함수는 한 가지 일만 해야함 -> 오류도 하나의 작업임
- 반복 없애기
- 구조적 프로그래밍: goto 절대 절대 절대 사용하지 말 것
- 다듬고, 함수를 만들고, 이름을 변경하고, 중복을 제거하고, 메서드를 줄이고 순서를 바꾸고, 클래스를 쪼개며 계속해서 변경해 나가기(단위 테스트는 항상 통과해야 한다)