본문 바로가기

나(다)/책

읽기 좋은 코드가 좋은 코드다

반응형

1장 - 표면적 수준에서의 개선

  • 특정한 단어를 사용하라 : get 대신 fetch나 download
  • 꼭 그래야 하거나 좁은 의미 단순 사용이 아닌경우에는 tmp와 같은 보편적인 이름의 사용을 피하라
  • 구체적인 이름을 이용하라 : ServerCanStart()는 CanListenOnPort()에 비해 의미가 모호하다.
  • 변수명에 중요한 세부 정보를 덧붙여라 : ~_ms이거나 ~_size
  • 사용범위에 따라 이름의 길이를 조절하라.
  • 대문자나 밑줄 등을 의미 있는 방식을 활용하라
    1. 이름에 정보 담기
    2. 재치 있는 이름보다 명확하고 간결한 이름이 더 좋다.
    3. retval이라는 이름은 정보를 제대로 담고 있지 않다. 대신 변수 값을 설명하는 이름을 사용하라.
    4. tmp라는 이름은 대상이 짧게 임시적으로만 존재하고, 임시적 존재 자체가 변수의 가장 중요한 용도일 때에 한해서 사용해야 한다.
      • for문의 i,j,k 같은 경우 해당 반복문의 뜻 포함 count_i 이거나 ci 이거나 c_i
    5. 하나의 함수에 하나의 기능
    6. 하나의 함수에 하나의 기능을 구현하고 필요시 캡슐화로 새로 구성
    7. 명명에 단위 포함
      • size_mb
      • max_kbps
    8. 상황에 맞는 속성 포함하기 : data 라는 변수를 가공 전,후로 구분
            filter\_data += 5;
            return data\_filter;
        }
    1. 패스워드가 'plaintext'에 담겨 있고, 추가적인 처리를 하기 전에 반드시 암호화 되어야한다. -> plaintext_password
    2. html의 바이트가 utf-8으로 변환되었다 -> html_utf_8
    3. 이름의 길이는 좁은 범위에서는 짧은 이름, 넓은 범위에서는 적당히 긴 이름
    4. 의미 축약은 되도록 피하되, str과 같은 일반적인 축약어는 사용하며, 축약어를 사용시 규칙을 정한다.
    5. 이름 포맷팅으로 의미 전달
      • _ : 클래스 멤버
        1. class 멤버로 존재시 offset_
            class Test{
                private String offset\_;
            }
    6. 함수,생성자,정의 : 대소문자
      • #define과 같이 CONTENS_NAME ="TEST" 와 같은 형태
      • constTestName
      • 생성자 -> new Test();
      • 일반 함수 -> testSum
    7. 특정 문법 : $
      • jQuery와 같은 저장 변수에 $ 붙이기
        var $doller\_test = $("doller\_test")
    8. html id와 class : _과 -

3장 : 오해 할 수 없는 이름들 : 영어 - 시한 폭탄 중 하나의 선을 잘라야 한다. "왼쪽을 잘라야하지?" "그래"했다. 그리고 폭탄은 터졌다. 그래(right)의미 중첩

  • 본인이 지은 이름의 의미 중복
    1. filter : results = DataBase.all_objects.filter("year <= 2011") 일 경우 -> 어떤 데이터가 들어 갈 것인가. 2011 이상인 데이터?, 2011 미만인 데이터? -> filter보다는 select, exclude로 의미 분명하도록
    2. bool 변수 : is, has, can, should로 구분 bool 리턴시 has가 적당
    3. 이름에 부정보다는 긍정을 쓴다 : bool disable_pass = false 보다 bool use_pass = true
    4. 시작 포함 마지막 경계를 포함 first, last
    5. 시작 포함 마지막 경계를 미포함 begin, end

4장 미학 VS 설계

  • 눈을 편하게 하라 : 정렬
    1. 들여쓰기
    2. 줄바꿈
    3. 줄 당 80글자과 같은 회사 내 규칙
    4. 코드 작성 전 해당 클래스, 함수에 대한 정보를 주석으로 예시 표현
    5. 헬퍼 함수를 만든다. : 함수를 간결하게 보여주기 위해 담는 함수
    6. 가능하다면 코드 열 맞추기.
      1. 변수명1 = test + " " +" "
      2. 변수명10 = test+ "m"+"y_fun "
    7. 비슷한 코드는 비슷하게, 다른 코드는 다르게 : 오타와 같은 에러
    8. 선언문을 블록으로 구성하라.

5장 주석

  • 주석은 필요한 부분과 필요 없는 부분을 확실히 구분 : 쓸모 없는 주석은 낭비
  • 코드의 함수, 변수 명을 보고 바로 알 수 있도록 구성
  • 나쁜코드 + 주석은 하지 말자.
  • 감독의 입장에서 코드의 작성 된 이유 내용
  • 코드의 담긴 철학 TODO 혹은 XXX과 같이 표현 1.
표시 보통의 의미
TODO 아직 하지 않은 일
FIXME 오작동을 일으킨다고 알려진 코드
HACK 아름답지 않은 해결책
XXX 위험! 여기 큰 문제가 있다.
  • 어떤 상수가 특정한 값을 가지게 된 사연 : CYCLE = 10 -> CYCLE은 9보다 작으면 안된다.
  • 특정 부분을 보고 "뭐라고?"라는 생각을 예측하여 주석 추가
  • 평범한 사람이 예상하지 못할 특이한 동작을 기록하라.
  • 파일이나 클래스 수준 주석에서 '큰 그림'을 설명하고 각 조각이 어떻게 맞춰지는지 설명하라.
  • 세부 코드에 주석을 달아 나무만 보고 숲을 보지 못하는 에러를 없애라.
  • 'it'이나 'this'같은 대명사가 같은 대명사가 여러 가지를 가리킬 수 있다면 사용하지 않는 것이 좋다.
  • 함수의 동작을 실제로 할 수 있는 한도 내에서 최대한 명확하게 설명하라.
  • 신중하게 선택 된 입/출력 에로 주석을 서술하라.
  • 코드가 가진 의도를 너무 자세한 내용이 아니라 높은 수준에서 개괄적으로 설명하라.
  • 같은 줄에 있는 주석으로(예. Function(/arg=/ …)) 의미가 불문명한 함수의 인수를 설명하라.
  • 많은 의미를 함축하는 단어로 주석을 간단하게 만들라.

9장 변수와 가독성

- 변수의 수는 최대한 줄여라 - 특히 전역변수
- 변수가 줄면 읽어야 되는 양은 절반이 될것이다.
- 클로저를 사용하라. return function(){ ... }()

10장 상관없는 하위 문제 추출하기

- 전체 흐름에서 필요 없는 하위 문제는 따로 관리
- Util이라는 폴더에서 공유 할 수 있도록 한다.
- 자잘하게 나눈다고 전부 좋은것은 아니다. (때로는 소극적으로)

반응형