1장 깨끗한 코드 | 코드 존재 | 코드는 요구사항을 상세히 표현하는 수단이다 코드는 기계가 이해하고 실행할 정도로 정확하고 상세하고 정형화 되어야한다 |
|
나쁜 코드 | 나중은 결코 오지 않는다 이전 버전에 있던 버그가 다음 버전에도 그대로 남아 있었다 프로그램이 죽는 횟수도 늘어났다 매번 얽히고설킨 코드를 해독해서 얽히고설킨 코드를 더한다 나쁜 코드가 쌓일수록 생산성은 떨어진다 |
||
나쁜 코드로 치르는 대가 | 재설계를 꿈꾸다 | ||
태도 | 나쁜 코드의 위험성을 잘 모르는 관리자. 그런 관리자의 말을 그대로 따르는 행동은 전문가 답지 못하다 |
||
원초적 난제 | 기한을 맞추려면, 집에 빨리가려면 나쁜 코드를 양산한다. 그러나 틀렸다. 나쁜 코드로 인해 늦어지고 기한도 놓친다. 기한을 맞추고, 빨리가려면 언제나 코드를 깨끗하게 유지하는 습관 |
||
깨끗한 코드라는 예술 | 코드감각: 구분할 줄 안다고 아니고 작성할 줄 알아야한다. 타고나거나 습득하거나 |
||
깨끗한 코드란? | |||
우리들 생각 | |||
우리는 저자다 | |||
보이스카우트 규칙 | 변수 이름 개선 긴 함수 분할 중복 제거 복잡한 if문 정리 |
||
프리퀄과 원칙 | |||
2장 의미 있는 이름 | 의도를 분명히 밝혀 | 지뢰찾기 게임 theList 로 쓰지 말고 gameBoard int[] 보다 클래스로 cell.isFlagged() |
|
그릇된 정보를 피해 | List 가 아닌데 변수명에 List 넣지마 List는 특수한 의미 L 이나 O는 소문자로 사용시 숫자 1과 0으로 혼돈하기 어려움 |
||
의미 있게 구분 | 1. 연속된 숫자 a1, a2 보다는 source, destination 으로 사용하면 편하다 - 편하다 -저자의 의도가 들어난다 - 정보를 제공 2. product 클래스 productInfo productData 개념을 구분하지 않은 채 이름만 달리한 것 3. 중복 nameString name 중에서 뭐가 나은가 Customer class VS CustomerObject 차이가 없잖아 읽는 사람이 차이를 알도록 이름을 지어라 |
||
발음하기 쉬운 이름 사용 | genymdhms VS generationTimestamp |
||
검색하기 쉬운 이름 | 검색할 때 7 VS MAX_CLASSES_PER_STUDENT |
||
인코딩 피하라 | - 헝가리식 표기법 - 멤버 변수 접두어 - 인터페이스 클래스, 구현 클래스 |
||
자신의 기억력을 자랑하지마 | for 문에서 i j k 제외 |
||
클래스 이름 | 명사로 해 동사로 하지마 같은 단어 하지마 |
||
메서드 이름 | 동사로 해 명사로 하지마 postPayment deletePage save 자바빈 표준 get set is |
||
기발한 이름 하지마 | firstName, lastName, street, city, state 이 조합은 주소이다. 주소라는 접두어를 추가해서 빠르게 주소라는걸 알게 하자 addrFirstName addrLastName addrStreet addrCity addrState |
||
한 개념에 한 단어 사용해 | |||
말장난 하지마 | |||
해법 영역에서 가져온 이름을 사용해 | |||
문제 영역에서 가져온 이름을 사용해 | |||
의미 있는 맥락을 추가 | |||
불필요한 맥락을 없애 | 모든 클래스 이름을 고급휘발유충전소 고휘충 을 넣지마라 짧은 클래스 이름이 좋다 |
||
3장 함수 | - 나쁜 것 추상화 수준이 다양함 코드가 너무 길다 중첩 if문 이상한 문자열 이상한 함수 호출 |
||
작게 만들어 | - 블록 - 들여쓰기 |
if문 else문 while문에 들어가는 블록은 한줄 |
|
한 가지만 해라 | - 함수 내 섹션 | 함수는 한가지만 해야한다 1. 테스트 페이지 판단 2. 설정 페이지, 해체 페이지 넣는다 3. html로 렌더링 |
|
함수 당 추상화 수준은 하나로 | - 위에서 아래로 | isTestPage(pageData) includeSetupAndTeardownPages(pageData, isSuite) rederPageWithSetupAndTeardowns(pageData, isSuite) |
|
switch문 | 스위치문은 작게 만들기 어렵다 한가지 작업만 하는 스위치문 만들기 어렵다 본질적으로 N가지를 처리한다 숨겨서 사용하라는데 뭥미 |
||
서술적인 이름을 사용해 | 코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행한다면 깨끗한 코드 이름이 길어도 된다 이름을 붙일때는 일관성이 있어야 한다 |
||
함수 인수 | - 단항 |
인수가 없는게 이상적 3개 이상은 피하는 편이 좋다 |
|
- 플래그 인수 | 함수로 boolean으로 넘기는건 구리다 함수가 여러개 처리한다고 공표하는 셈 render(boolean isSuite)로 할바에 renderForSuite(); renderForSingleTest(); 두개로 나눠라.... |
||
- 이항 함수 | |||
- 삼항 함수 | |||
- 인수 객체 | |||
- 인수 목록 | |||
- 동사, 키워드 | 키워드를 추가해라 assertEquals() 보다는 assertExpectedEqualsActual(expected, actual) |
||
사이드 이펙트 조심 | - 출력 인수 | appendFooter(StringBuffer report) report.appendFooter() 가 낫다 출력인수는 this 인거지.. 매개변수로 전달하지마 |
|
명령, 조회 분리 | 함수는 수행: 객체 변경 답: 객체 정보를 반환 둘 중에 하나만 해라 |
||
오류코드 << 예외 | - try catch 블록 |
매번 모든 함수를 체크해서 if fififififififfi 하지말고 try { deletePage(page) registry.deleteReference(page.name) configKeys.deleteKey(page.name.makeKey()) } catch (Exception e) { logError(e); } |
|
- 오류처리 | try { deletePageAndAllReferences(page) } catch (Exception e) { logError(e); } 요렇게 함수 3개를 하나로 묶어라 private void deletepageAndAllReferences(Page page) throws Exception { deletePage(page) registry.deleteReference(page.name) configKeys.deleteKey(page.name.makeKey()) } |
||
- Error.java 의존성 | public enum Error { OK, INVALID, NO_SUCH, LOCKED } |
||
반복 노노 | |||
구조적 프로그래밍 | |||
함수를 어떻게 짜죠 | |||
4장 주석 | 주석은 나쁜 코드를 보완 못해 | ||
코드로 의도를 표현해 | |||
좋은 주석 | 법적 주석 | ||
정보 제공 | |||
의도 설명 | |||
의미를 명료하게 밝히는 | |||
결과를 경고하는 | |||
TODO | |||
중요성을 강조 | |||
공개 API javaDocs | |||
나쁜 주석 | 주절 거리는 | ||
같은 이야기를 계속.. | |||
오해할 여지 있는 | |||
의무적으로 다는 | |||
이력을 기록 | |||
있으나 마나한 | |||
무서운 잡음 | |||
함수, 변수로 표현 할 수 있다면 주석 달지마 | |||
위치를 표시 | |||
다는 괄호에 다는 | |||
공로를 돌리는, 저자를 표시 | |||
주석으로 처리한 코드 | |||
html 주석 | |||
전역 정보 | |||
너무 많은 정보 | |||
모호한 관계 | |||
함수 헤더 | |||
비공개 코드에서 javaDocs |
'java' 카테고리의 다른 글
클린코드 10장 클래스 (0) | 2023.10.07 |
---|---|
클린코드 9장 단위테스트 (0) | 2023.10.07 |
클린코드 8장 경계 (0) | 2023.10.07 |
chap04 선택제어문 (if, switch), 반복제어문 (for, while, dowhile), 제어키워드(break, continue) (0) | 2022.07.24 |