[전문가를 위한 C++] 코딩 스타일
‘전문가를 위한 C++ - Marc Gregoire 지음, 남기혁 옮김’ 책을 참고하여 작성한 포스트입니다.
코딩 스타일의 중요성
바람직한 스타일의 기준
- 잘 작성된 코드에는 다음과 같은 공통적인 특징들이 있다.
- 문서화
- 코드 분해
- 명명 규칙
- 언어 사용
- 코드 서식(포매팅)
코드 문서화(documentation)
- 프로그래밍에서 말하는 문서화란 주로 소스 파일에 주석(comment)을 다는 것을 의미
주석을 작성하는 이유
사용법을 알려주는 주석
- 함수의 기능은 주석없이 함수 이름, 리턴 타입, 매개변수 이름과 타입만으로 쉽게 보여줄 수 있어야 한다.
- 이 외에 함수 호출의 선행 조건과 후행 조건, 함수가 던지는 예외, const 레퍼런스를 사용하지 않은 이유 등은 주석으로 남기는 것이 좋다.
- int 같은 범용 타입을 리턴하는 경우 이 타입이 어떤 값을 표현하는 지 주석을 남기는 것도 좋지만, 클래스를 따로 만들어 리턴타입을 주석없이 알 수 있게 명명하는 것도 괜찮다.
- 즉, 공식 문서에는 구현에 대한 설명이 아니라 코드의 동작(입출력, 에러, 용법, 성능 보장 등)에 대한 설명만 나와야 한다.
복잡한 코드를 설명하는 주석
- 코드가 이해하기 어려운 경우는 설명 주석을 달아 주어도 좋다.
메타 정보를 제공하는 주석
- 메타 정보(meta-information)는 코드의 동작이 아닌 코드 생성에 대한 세부사항만 표현한다.
- 저작권 문구, 변경 내역, 저자, 작성 일자, 주요 기능 등을 표현할 수 있다.
주석 스타일
문장 단위 주석
- 모든 문장마다 주석을 다는 방법이다. 보통은 바람직하지 않지만,
- 코드가 굉장히 복잡하고 난해한 경우 코드의 작성 의도를 설명하는 문장 단위 주석은 괜찮다.
머리말 주석
- 주요 사항을 남기면 좋다.
- 저작권 정보
- 파일과 클래스에 대한 간략 설명
- 최종 수정 일자
- 최종 작성자
- 변경 내역
- 파일에서 구현한 기능의 ID
- 미완성 기능
- 발견된 버그
고정 양식 주석
- JavaDoc 스타일 같은 표준 양식에 따라 주석을 작성하는 스타일이다.
임의 주석
- 정해진 형식과 관계없이 필요에 의해 주석을 다는 스타일이다.
- 다음과 같은 가이드라인을 따르는 것이 좋다.
- 주석 작성 전 주석이 필요 없도록 코드 수정이 가능한 지 검토한다.
- 쉽게 이해하기 어려운 부분에 주석을 단다.
- 코드 업데이트 시 주석도 반드시 업데이트 해준다.
- 한 함수의 주석을 여러 부분으로 나눠서 작성한다면, 그 함수를 더 작은 단위의 함수로 나눌 수 없는지 검토한다.
코드가 곧 문서인 코드
- 잘 작성된 코드는 대체로 주석이 적고 쉽게 이해가 가능하다.
- 코드를 더 작은 단위로 코드 분해 해보자.
코드 분해(decomposition)
리팩터링(refactoring)을 통한 코드 분해
- 추상화 수준을 높이는 기법
- 필드 캡슐화
- 필드를 private,
- getter, setter 메서드로 접근하게 함
- 타입 일반화
- 코드를 공유하기 좋게 좀 더 일반적인 타입 사용
- 필드 캡슐화
- 코드를 좀 더 논리적으로 분해하는 기법
- 메서드 추출
- 거대한 메서드에서 일부를 뽑아내 새로운 메서드 정의
- 클래스 추출
- 클래스 내 코드 중 일부를 새로운 클래스로 옮김
- 메서드 추출
- 명칭과 위치를 개선
- 메서드 및 필드 옮기기
- 좀 더 적합한 클래스나 소스 파일로 이동
- 메서드 및 필드 이름 바꾸기
- 목적이 더 잘 드러나도록 이름 바꾸기
- 올리기
- 기본(베이스, base) 클래스로 옮기는 기법
- 내리기
- 상속(확장, derived) 클래스로 옮기는 기법
- 메서드 및 필드 옮기기
- 핵심은 이해하고, 유지하기 쉬운 형태로 변환하는 것이다.
설계 기준으로 코드 분해하기
- 설계부터 하고..
- 나중에 구현할 부분을 따로 빼놓는 방식으로 작성
명명 규칙
- C++ 컴파일러의 규칙 중 몇.
- 첫 글자로 숫자 x
- 더블 언더스코어는 이름에 x
- 언더스코어 다음 대문자 시작도 x
- 글로벌 네임스페이스에서 언더스코어 시작도 x
좋은 이름과 나쁜 이름
- 용도가 명확히 드러나는 이름이 좋은 이름이다.
명명 규칙
- 카운터
- 최상위 카운터는 i, 그다음은 j가 관례다.
- 2D 데이터를 다룬다면 헷갈리지 않게 Row, Column으로 표현하는 것도 좋다.
- 접두어
- 불의 경우 b 혹은 Is를 붙이는 등.
- 헝가리안표기법
- 게터와 세터
- 게터는 주로 Get, 세터는 Set을 접두어로 붙이면 좋다
- 대소문자 활용
- 네임스페이스를 적용한 상수
- 열거 타입도 좋다
언어의 기능에 스타일 적용하기
상수 사용법
- 2.717828(초월수 e)같은 매직 넘버(magic number)를 그대로 쓰지 말고,
- 그 값을 의미를 나타내는 변수에 넣어 사용하는 것이 좋다.
- c++20 에는 표준 라이브러리에 수학 상수가 추가되었다.
std::numbers::e, pi, sqrt, phi
등
포인터 대신 레퍼런스 사용하기
- 레퍼런스가 더 안전하다.
- 메모리 주소를 직접 다루지 않고, nullptr이 될수도 없기 때문
- 코딩 스타일 측면에서 더 깔끔하다.
- 스택 변수와 문법이 같아서 *나 &와 같은 기호를 안써도 된다.
- 메모리의 소유권을 명확히 표현할 수 있다.
- 전달된 객체를 레퍼런스로 받도록 메서드를 작성하면 객체 읽기, 수정은 자유롭지만 객체에 할당된 메모리 해제는 쉽지 않다.
- 포인터는 가능하기 때문에 어느 쪽에서 해제해야 할 지 가늠하기 어렵다.
사용자 정의 익셉션
코드 서식(formatting)
…
Leave a comment