Search
Duplicate
🚗

섹션 3: 코드 문서화

1. 도입

코드 문서화를 왜 하는가?

클린 코드에서 작명과 주석의 중요성에 대해 강조하는 이유는 무엇일까?
커밋 메시지를 제대로 달면 어떤 점이 좋을까?
오류 메시지와 오류 코드 역시 코드 문서화의 종류가 아닐까?

2. 프로그래밍 과정에서 이름 짓기와 관련된 심리학

오해할 수 없는 이름의 중요성

코드 기반에서 식별자 이름이 중요하다.
타입, 변수, 메소드, 함수, 모듈, 라이브러리, 네임스페이스 등
코드 기반의 상당 부분을 차지
코드 리뷰 시 지적되는 사항
이름은 문서화의 가장 쉬운 형태
이름이 표식 역할을 함
좋은 이름과 나쁜 이름은 어떻게 구분할까?
문법적인 정의
비정상적인 대문자 사용: paGecoUnter
연속된 밑줄 두 개: page__counter
사전 미등재 단어: page_countr
너무 많은 단어: page_counter_converted_andnormalized_value
짧은 이름: P
열거형 식별자에서 임의의 선언 순서: CardValue={ACE,EIGHT,FIVE,FOUR,JACK,KING…}
식별자 인코딩: int_page_counter
명명법 규약 이상: Page_Counter
코드 기반 내에서 일관성
프로그램 개발 초기에 만들어진 식별자의 품질이 계속 유지된다.
변수명이 가지고 있는 정보가 너무 많다.
코드 도메인에 대한 정보
프로그래밍 자체에 대한 정보
변수에 담긴 이미 알고 있는 정보

더 나은 이름을 위한 모델

페이텔슨의 3단계 모델
1.
이름에 포함할 개념을 선택한다.
업무 영역 또는 컴퓨터 기술 별로 고민한다. 이름의 의도가 중요하다. 개체가 어떤 정보를 보유하며 무엇을 위해 사용되는가?
정보를 제공해야하는 경우도 있다. 단위, 안전한 데이터인가? 등
2.
각 개념을 나타낼 단어를 선택한다.
업무 영역에서 사용되는 특정 단어나 코드 기반 전체에서 사용되는 단어
동의어나 유의어 등 경쟁적인 옵션이 있을 경우 문제가 있을 수 있다.
어휘 사전을 따로 정의해두어야 할지도 모른다.
3.
이 단어를 사용해 이름을 구성한다.
선택된 단어를 사용해 이름을 구성할 때, 자연어에 맞출 필요가 있다.
pointMax vs maxPoint
indexOf, elementAt

간단 정리

프로그래밍 과정에서 이름이 끼치는 영향은 매우 높다.
좋은 이름과 나쁜 이름의 차이를 인식해야 한다.
오해할 수 없는 이름을 피하기 위해 쉬운 이름을 어떻게 만들어낼지 고민해야 한다.
더 나은 이름을 위해 페이텔슨의 3단계 모델을 기억하라.
이름에 포함할 개념을 선택한다.
각 개념을 나타낼 단어를 선택한다.
단어들을 사용해 이름을 구성한다.

3. 프로그램 개발 과정에서 영어로 이름 짓기

기본 원칙

서술적인 이름을 사용하라
적절한 추상화 수준에서 이름을 선택한다.
상세한 구현을 드러내는 이름을 피하자.
작업 대상 클래스나 함수가 위치하는 추상화 수준의 이름을 선택하자.
가능하다면 표준 명명법을 활용하라.
프로젝트에 유효한 의미가 담긴 이름을 많이 사용할수록 독자가 코드를 이해하기 쉬워진다.
ex) Decorator, toString, Impl
명확한 이름
넓은 영역에 사용되는 변수에는 긴 이름을 사용하자.
인코딩을 피하라
이름에 유형 정보와 범위 정보를 넣어서는 안 된다.
이름으로 부수 효과를 설명하라.

작명 규칙

이름에 정보를 담자
단어를 잘 선택해야 한다. 의미를 활용해서커버 추가
보편적인 이름 피하기
추상적인 이름 대신 구체적인 이름 활용
추가적인 정보 덧붙이기
평문 암호인 경우, password → plaintext_password
눈에 잘 띄게 만들기
네이밍 컨벤션
클래스 이름은 도메인의 문제를 구체적으로 나타내는 명사구가 적합하다.
메서드 이름은 동사나 동사구가 적합하다.
한 개념에 한 단어만 사용하라.
한 단어를 두 가지 목적으로 사용하지 마라.
추상적인 단어인 addget같은 단어를 피하라.
length vs count vs size
연속적인 구성 요소 ⇒ length
더 느슨한 구성 요소의 숫자를 지정 ⇒ count
구성 요소의 최대 크기를 지칭 ⇒ size
할당된 메모리를 지칭 ⇒ capacity

간단 정리

앞서 설명한 심리학을 응용해 영어로 이름 짓는 몇 가지 기본 원칙이 존재한다.
핵심은 추상화와 구체화 사이의 밸런스다.
구체적인 작명 규칙은 기존 코드 기반이나 오픈 소스 코드를 많이 읽어보면 도움이 된다.
주요한 부분은 이름에 맥락과 정보를 얼마나 잘 담느냐에 달려 있다.

4. 영어로 주석 제대로 달기

코드 주석

코드 주석의 목적
코드를 읽는 사람이 코드를 작성한 사람만큼 코드를 잘 이해하기 위해 돕는다.
코딩을 수행하면서 머리 속에 들어있는 정보를 정리한다.
주의할 점
나쁜 코드에 주석을 달지 말고 새로 짜라.
주석은 오래될 수록 코드에서 멀어진다.
설명하지 말아야할 내용은?
코드만 봐도 충분히 알 수 있는 내용을 다시 설명하는 주석
나쁜 함수나 변수명을 설명하려 드는 내용
설명하면 좋은 내용
코드가 특정 방식을 선택한 이유
코드에 담긴 결함이나 향후 할 일
어떤 상수가 특정 값으로 정해진 이유
평범한 사람이 예상치 못한 특이한 동작
파일/클래스 수준에서 큰 그림을 설명하는 주석

코드 문서화

Javadocs와 같은 코드 문서화 도구에서 주의할 사항
형태가 갖춰져 있으므로 중복되거나 그릇된 정보를 제공할 가능성이 있다.
공개 API에 대해서만 작성하기 때문에 시스템 내부의 클래스와 함수를 작성해서는 안 된다.
주석과 관련된 스타일 가이드
2인칭이 아닌 3인칭을 사용하라.
메소드 설명은 동사구로 시작하라.
클래스/인터페이스/필드는 주어를 생략하라.

간단 정리

코드 주석은 코드의 How를 설명하는 대신 핵심 요약이나 왜, 배경 맥락을 설명해야 한다.
코드 문서화는 내부 동작 방식이 아니라 파일이나 클래스 수준 주석에서 큰 그림을 설명한다.

5. 영어로 커밋 메시지 제대로 만들기

커밋 메시지가 중요한 이유는 무엇을 왜 어떻게 변경했는지 이해하는 과정에 있어서 단초를 제공한다.

커밋 메시지 기초

커밋은 작고 한 번에 문제 하나만 다루는 편이 좋다.
HOW 대신 WHAT과 WHY
제목과 본문으로 구성하라.
짧게 쓰는 것이 좋다.
Jira 티켓, 패턴 페이지, 메뉴얼 페이지 등 참고 링크가 있으면 좋음
커밋 메시지에서 우리가 고민해야 할 사항
이 변경이 필요한 이유는?
이 문제를 해소하는 방법은?
변경이 가져온 부작용은?

좋은 커밋 메시지를 위한 영단어 목록

FIX: 올바르지 않은 동작을 고친 경우
ADD: 코드나 테스트, 예제, 문서를 추가한 경우
REMOVE: 코드 삭제가 있을 경우
USE: 뭔가를 사용해 구현을 하는 경우
REFACTOR: 리팩토링을 하는 경우
SIMPLIFY: 코드를 단순화하는 경우
UPDATE: 수정/추가/보완하는 경우
IMPROVE: 호환성/테스트 커버리지/성능/접근성 등 향상이 있을 경우
IMPLEMENT: 모듈이나 클래스 단위로 코드를 추가한 경우
MOVE: 코드 이동이 있는 경우

간단 정리

커밋 메시지는 형상 관리 이력에서 가장 중요한 요소다.
변경이 필요한 이유, 문제를 해결하는 방법, 변경이 가져오는 부작용 등을 담고 있어야 한다.
커밋 메시지를 제대로 작성하기 위한 원칙
주제와 본 내용 사이에 한 줄을 띄워라
주제 행은 일반적으로 50 글자 내외가 좋다
주제 행 첫 글자는 대문자가 되어야 한다
주제에 점을 찍지 마라
주제 행을 명령문으로 만들어라
본문은 72행에서 행갈이를 하라
방법이 아니라 이유를 설명하라

6. 영어로 오류 메시지 제대로 만들기

오류 메시지 작성이 어려운 이유

오류는 보통 추상적으로 작성되기 마련이기 때문에 이해하기 쉽게 작성하는 것이 어렵다.
좋은 오류 메시지의 세 가지 구성 요소
맥락: 오류의 원인은? 실패했을 때 코드가 무엇을 하고 있었는지
오류 메시지는 이야기다. 오류 메시지의 경우 문제를 일으킨 코드가 실패하는 경우, 수행하려는 작업을 독자에게 설명하라.
Couldn’t parse Config fileCouldn’t parse config file: /etc/sample-config.properties
파일과 관련된 경우에는 절대 경로를 출력하는 것이 좋다. 만약 파일의 특정 부분인 경우, 줄 번호나 줄 자체를 출력하는 것이 좋다.
오류 자체: 정확히 무엇이 실패했는지
메시지는 짧고 간결하게 적는 것이 좋다.
문제의 심각성, 발생한 문제 소개, 문제가 발생한 위치, 문제가 발생한 이유를 포함해야 한다.
오류 완화 방법: 오류를 극복하기 위해 어떤 일을 해야 하는지
사용자가 오류를 완화하기 위한 조치를 설명해야 한다.
회피하기 위해 취해야할 조치를 설명하며 오류 코드를 포함하면 더욱 좋다.

주의 사항

오류 메시지를 읽는 독자는?
일반 사용자: 최종 소프트웨어를 사용하는 입장에서 오류를 바라본다.
개발자/운영자: 라이브러리 혹은 프레임워크는 사용하는 입장에서 오류를 바라본다.
주의
일반 사용자를 대상으로 제공하는 오류 메시지의 경우, 민감한 보안 관련 내요은 노출해서는 안 된다.

간단 정리

좋은 오류 메시지의 세 가지 구성 요소
맥락, 오류 자체, 오류 완화 방법
짧으면서도 할 이야기는 다 하는 정확한 메시지가 중요하다.