[CppCoreGuidelines 한국어 번역]
핵심 가이드라인의 목적은 개발자들이 모던 C++ (현재는 C++17)을 받아들이고 보다 일관적인 형태의 스타일로 코드를 작성하도록 하는 것이다.
이 문서에서 다루고 있는 규칙들이 모든 코드에 효과적으로 적용할 수 있다고 생각하지는 않는다. 오래된 시스템을 새롭게 업그레이드하는 것은 쉽지 않은 일이다. 하지만 여기서 다루는 규칙들을 적용한다면 기존의 방식보다 오류가 발생할 가능성이 낮고, 유지 보수가 편리한 코드를 작성할 수 있을 것이라 확신한다. 또한 이러한 규칙들은 개발 초기에 좀 더 빠르고 쉽게 개발을 진행하는 데도 도움이 될 것이다. 분명히 말할 수 있는 것은, 이러한 규칙들을 적용하면 제로-비용 원칙(Zero-overhead principle)에 입각해 이전보다 더 나은 동작을 수행되는 코드를 만들 수 있다는 점이다. (제로-비용 원칙이란 "사용하지 않는 부분에 비용을 낭비하지 마라.", 또는 "올바른 추상화 메커니즘을 사용했을 경우, 적어도 저수준 언어로 하드코딩한 것 만큼의 성능을 얻을 수 있다." 정도로 설명할 수 있다.) 새로운 코드를 작성하거나 기존 코드를 개선할 여지가 생겼다면, 적용 가능한 수준에서 규칙들을 적용해 보기 바란다.
[내가 받아들이기로 결정한 convention들 from google style과 cppcoreguidelines]:
- 변수의 선언은 초기화 되는곳과 가장근처에서 선언과 동시에 초기화를 시킨다.
- 리턴 구문은 여러번 써도 괜찮다.
- 예외에서는 assert를 사용해라. 그리고 무조건 없는게 효율적이지만은 않다.
- namespace는 반드시 사용한다. 그리고 모든 namespace는 프로젝트 이름, 팀이름으로 한다.
- Public, protected, private 순으로 선언한다.
- 파일 관련 헤더, c관련 헤더, c++관련 헤더, stl 관련해더, 그 외의 라이브러리 참조헤더 순으로 적는다.
- Using namespace는 사용하지 않는다.
- 클래스는 public으로 변수는 private으로 한다.
- Virtual 보다는 override를 사용한다.
- 변수 이름은 snake style로 메서드는 camelstyle로, const는 k+파스칼 스타일로 통일 한다.
- 공백에서 if문과 else문은의 순을 따른다.
} else { } - 공백은 텝보다는 2번 스페이스바를 이용한다.
- 주석은 코드를 보고 알수 있는 내용을 담지 않는다. 의도를 쓰고, 간략히 유지한다.
- 주석의 들여쓰기 스타일을 정의하고 유지한다.
- 이름은 구체적으로 적는다.
- struct가 튜플같은 자료형 보다 구체적으로 정의할수 있어서 낫다.
- 과한 스페이스는 코드의 혼란을 가중한다. (Int)는 괜찮지만, ( int )는 과하다.
- overloading을 할수 있는것은 함수로 선언하지 말라.
- 인자 타입으로 void는 사용하지 마라.
- const는 자주 사용하라.
- for문 안에서만 사용하는 변수는 그 안에서만 사용해라. 만약 객체라면 밖에 선언한다.
- 포인터를 지우는 ownership을 쉽게 넘겨주지 마라.
- 함수는 단순하게 하나에 한 역할만 하게 한다.
- inline함수는 10줄 이하만 사용한다. 또 난발하지 않는다.
- 보편성을 고려한다면, 스마트 포인터 대신에 T*나 T&의 인자를 사용한다.
- 입력(in) 매개변수는 복사 비용이 적게 드는 타입의 경우 값으로 전달하고, 그 외에는 상수 참조형으로 전달하라.
- 넘겨주거나 전달하는 매개변수는 std::move나 std::foward로만 사용한다.
- 출력값 여러개를 반환할때는 튜플이나 구조체를 선호한다.
- 함수의 인자 개수를 최소로 유지하라
- 배열을 단일포인터로 전달하지 마라. 데신,를 사용하라.
- Circle arr[10]; draw2(span(arr)); // 원소
- null이 되면 안되는 포인터는 not_null로 선언하라.
- 클래스 계층에 대한 interface로 추상 클래스를 사용해라.
- 타입이 불변조건을 가진다면, class를 사용하라; 데이터 멤버들에 대한 제약이 자유롭다면 struct를 사용하라
- non-public 멤버가 있다면 struct보단 class를 사용하라
- 생성자에서 예외처리를 하게 만들어 준다.
- 매크로보다 열거형을 사용하라
- unique_ptr이나 shared_ptr을 사용하라.
- nullptr이나 ‘\0’을 사용하라.
- cast를 최대한 피하고, static_cast<>를 사용해라.
- new와 delete함수를 사용해라, 그리고 new와 delete사용은 자원 관리함수 외부에서 피해라.
- 암시적 형변환을 피하라.
- 유효하지 않은(invalid) 포인터를 역참조하지 마라
- 범위 기반 for문에서 루프변수를 복사하여 사용하지 마라, 데신 참조자를 사용하라.
- 변수가 있다면 while보다는 for문을 사용하라.
- 배열 접근에는 unsigned를 쓰지 말고 gsl::index를 사용하라
- 소멸자, 자원해체자, swap은 절때 실패해서는 안된다.
- 모든것을 예외처리 하려 하지 말라.
- Try/catch문을 최소화 하라.
- 기본적으로 객체를 변경 불가능하도록 만들어라
- 기본적으로 멤버 함수들은 const로 만들어라
- 기본적으로 포인터와 참조는 const로 전달하라
- 개체 생성 이후 변하지 않는 값은 const로 정의하라
- 컴파일 시간에 계산될 수 있는 값은 constexpr을 사용하라
- 함수가 예외를 던지지 않는다면, nonexcept로 선언한다.
'알아두면 편한 개발지식' 카테고리의 다른 글
vim (0) | 2021.01.28 |
---|---|
SQLlight (0) | 2021.01.28 |
MarkDown 실시간 서버 확인 (0) | 2020.08.11 |
MarkDown 공부하기 (0) | 2020.08.11 |
리눅스 파일 찾기 grep (0) | 2020.08.08 |