ROS는 오픈소스 프로젝트이기 때문에 여러 개발자가 함께 코드를 작성하고 관리한다. 따라서 개발자마다 다른 방식으로 코드를 작성하기보다는 일정한 규칙을 정하고 이를 준수하는 것이 중요하다.
코드 스타일을 일관되게 유지하면 다른 개발자가 코드를 이해하기 쉬워지고 코드 리뷰도 편해진다. 또한 프로그래밍 언어의 특정 기능으로 인해 발생할 수 있는 오류나 다양한 문제를 줄이는 데에도 도움이 된다.
ROS 커뮤니티에서는 ROS 2 Developer Guide, ROS Enhancement Proposals (REPs), ROS 2 Code style 등의 가이드와 규칙을 통해 일관된 개발 방식을 유지하고 있다.
이번에는 기본적인 네이밍 규칙과 C++, Python의 코드 스타일을 살펴본다.
오픈소스 프로젝트에서는 협업을 위해 일관된 코드 스타일을 사용하는 것이 중요하다.
코드 스타일을 지키면 다음과 같은 장점이 있다.
ROS 역시 여러 개발자가 함께 개발하는 오픈소스 프로젝트이기 때문에 이러한 코드 스타일 가이드를 사용한다.
ROS 2의 C++ 코드 스타일에서는 C++14 Standard를 준수한다.
C++14 Standard 준수
한 줄의 최대 길이는 100 문자로 제한한다.
C++에서는 이름의 용도에 따라 다음과 같은 규칙을 사용한다.
| 형식 | 사용 대상 |
|---|---|
CamelCased | 타입, 클래스, 구조체, 열거형 |
snake_case | 파일, 패키지, 인터페이스, 네임스페이스, 변수, 함수, 메소드 |
ALL_CAPITALS | 상수, 매크로 |
예를 들어 변수와 함수는 다음과 같이 작성한다.
int robot_speed;
void move_robot();
클래스는 다음과 같이 작성한다.
class RobotController
{
};
자료에서는 파일 확장자도 다음과 같이 구분한다.
소스 파일 → .cpp
헤더 파일 → .hpp
또한 전역변수는 사용이 불가피한 경우 g_ 접두어를 사용하며, 클래스 멤버 변수는 이름 마지막에 _를 붙인다.
예:
int g_count;
class Robot
{
int speed_;
};
C++ 코드의 기본 들여쓰기는 공백 2개를 사용하며 탭 문자는 사용하지 않는다.
또한 클래스의
public:
protected:
private:
는 들여쓰기를 사용하지 않는다.
if, else, do, while, for 등의 구문에는 괄호를 사용한다.
예:
if (speed > 0)
{
move_robot();
}
C++에서는 주석의 용도에 따라 다음과 같이 구분한다.
/**
* Robot controller
*/
// Move the robot
자료에서는 문서 주석에 /** */, 구현 주석에 //을 사용하도록 설명하고 있다.
C++ 코드 스타일을 자동으로 검사하기 위해 다음 도구를 사용한다.
ament_cpplint
ament_uncrustify
정적 코드 분석이 필요한 경우에는 다음 도구를 사용할 수 있다.
ament_cppcheck
자료에서는 다음과 같은 추가 규칙도 소개한다.
char * c; 형태를 사용한다.set<list<string>> 형태를 사용한다.ROS 2의 Python 코드 스타일은 ROS 2 Developer Guide와 ROS 2 Code style을 기준으로 하며, Python의 PEP 8을 준수한다.
Python 3을 사용한다.
자료에서는 Python 3.5 이상을 기준으로 설명한다.
Python 코드의 한 줄 최대 길이는 100 문자이다.
Python에서는 용도에 따라 다음과 같은 네이밍 규칙을 사용한다.
| 형식 | 사용 대상 |
|---|---|
CamelCased | 타입, 클래스 |
snake_case | 파일, 패키지, 인터페이스, 모듈, 변수, 함수, 메소드 |
ALL_CAPITALS | 상수 |
예:
class RobotController:
pass
robot_speed = 10
def move_robot():
pass
Python의 기본 들여쓰기는 공백 4개를 사용한다.
탭 문자는 사용하지 않는다.
예:
if robot_speed > 0:
move_robot()
계산식과 배열 인덱스 등에 괄호를 사용하며, 자료형에 따라 적절한 괄호를 사용한다.
[ ] → 대괄호
{ } → 중괄호
( ) → 소괄호
Python의 문서 주석은 """을 사용하며 PEP 257 Docstring Conventions을 준수한다.
"""
Robot controller
"""
구현 주석은 #을 사용한다.
# Move the robot
Python 코드 스타일을 자동으로 검사하기 위해 다음 도구를 사용한다.
ament_flake8
자료에서는 문자열을 표현할 때 큰따옴표(")보다는 작은따옴표(')를 사용하도록 설명한다.
예:
name = 'robot'
| 항목 | C++ | Python |
|---|---|---|
| 기본 규칙 | C++14 | Python 3 |
| 최대 라인 길이 | 100자 | 100자 |
| 클래스/타입 | CamelCased | CamelCased |
| 변수/함수 | snake_case | snake_case |
| 상수 | ALL_CAPITALS | ALL_CAPITALS |
| 들여쓰기 | 공백 2개 | 공백 4개 |
| 문서 주석 | /** */ | """ |
| 구현 주석 | // | # |
| 린터 | ament_cpplint, ament_uncrustify | ament_flake8 |
| 정적 분석 | ament_cppcheck | - |
이번에는 ROS 2에서 사용하는 코드 스타일 규칙을 살펴보았다.
ROS는 여러 개발자가 함께 개발하는 오픈소스 프로젝트이기 때문에 일관된 코드 스타일을 사용하는 것이 중요하다.
C++에서는 C++14, 100자 이내의 라인 길이, CamelCased와 snake_case 등의 네이밍 규칙과 공백 2개의 들여쓰기 규칙을 사용한다.
Python에서는 PEP 8을 기반으로 하며, 100자 이내의 라인 길이와 공백 4개의 들여쓰기, snake_case 등의 네이밍 규칙을 사용한다.
또한 C++에서는 ament_cpplint, ament_uncrustify, ament_cppcheck, Python에서는 ament_flake8과 같은 린터 및 정적 분석 도구를 이용해 코드 스타일을 자동으로 검사할 수 있다.
이러한 규칙을 지키는 것은 단순히 코드를 예쁘게 작성하기 위한 것이 아니라, 여러 개발자가 함께 코드를 이해하고 유지보수하기 위한 중요한 개발 규칙이라고 할 수 있다.