본문 바로가기

java

클린코드 1~4장

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