---
# System prepended metadata

title: Coding Style
tags: [NTURT, electrical_system]

---

# Coding Style
###### tags: `electrical_system` `NTURT`

## Code format

The "esthetic" part of the code (everything other than naming) should follow `google` format, [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html). And I strong recommand you to read this file as it contains a lot of information about better coding.

### Code formatter

In order to force all code to follow the same "esthetic", code formatter is used, especially, [clang-format](https://clang.llvm.org/docs/ClangFormatStyleOptions.html), and there's a VS code extension for it [xaver.clang-format](https://marketplace.visualstudio.com/items?itemName=xaver.clang-format).

:::info
Note: In order to use clang-format to format your code according to google style, simply add a `.clang-format` file in the root directory of your project with only one line:

```=
BasedOnStyle: Google
```

:::

## Naming convension

### Variable and functions

:::info
snake_case: All lower case letter with space replaced by underscore.
:::

Ex. (C++)

```cpp=
std::string my_state = "i'm fine\n";
std::string how_are_you() {
    return my_state;
}

int what_day_it_is(int day) {
    return day;
}
```

### Class/Struct name

:::info
PascalCase: Capital for the first letter of every word, without space.
:::

Ex. (C++)

```cpp=
struct MyComputer {
    bool it_is_fine_ = false;
};
```

**Not like this**

```cpp=
struct MyComputer_t {
    bool it_is_fine_ = false;
};
```

### Preprocessor

#### Define

:::info
SCREAM_CASE: All capital letters with space replaced by underscore.
:::

Ex. (C++)

```cpp=
#define ONE 1
#define MY_AGE 20
```

#### Include guard

:::info
SCREAM_CASE: All capital letters with space replaced by underscore.
:::

Ex. (C++)

```cpp=
#ifndef YAMEL_LOADER_HPP
#define YAMEL_LOADER_HPP
...
#endif // YAMEL_LOADER_HPP
```

without underscore suffixes and prefixes

### Member variables/functions for classes

:::info
Underscore after the member variable name, with function using the normal snake_case naming.
:::

:::info
The order for the accessible of class data is `public`, `private`, and `protected`.
:::

Ex. (C++)

```cpp=
class SomeClass {
    public:
        SomeClass(bool state, int age) :
            state_(state),  age_(age) {
            // do nothing
        }
        bool get_state() {
            return state_;
        }
    private:
        bool state_;
        int age_;
    protected:
        double weight_;
};
```

**Not like this**

```cpp=
class SomeClass {
    protected:
        double weight_;
    private:
        bool state;
        int age;
    public:
        SomeClass(bool state, int age) :
            state(state),  age(age) {
            // do nothing
        }
        bool get_state_() {
            return state;
        }
};
```

## Cmake

### File Heirarchy

```
project_root
├── app
│   └── ...
├── doc
│   └── ...
├── include
│   └── ...
├── scripts
│   └── ...
├── src
│   └── ...
├── test
│   └── ...
├── .git
│   └── ...
├── CMakeLists.txt
├── README.md
├── software_development_log.md
└── .gitignore
```

where

- app: Contains executables source files that will be compiled as executables
- doc: Contains Documentation (page description for doxygen) and files read/write during run time (ex. yaml files)
- include: Contains header files (hpp)
- scripts: Contains scripting lauguage (python, bash) files that is interprted at run time
- src: Contains library source files that will only be compiled as library
- test: Contains test soruce files that will be compiled as executables
- .git contains git
- CMakeLists.txt: Instruction for cmake to compile the code
- README.md: The usages and functionalities of this project
- software_development_log.md: Development process of this project
- .gitignore: Files to ignore

### CMakeLists

:::info

1. The target of cmake function is in the same line of the function, otherwise not in the same line.
2. Tab is eight spaces long.

:::

Ex. (cmake)

```cmake=
cmake_minimum_required(VERSION 3.16)
project(project CXX)
set(CMAKE_CXX_STANDARD 17)

include_directories(
        include
)

add_executable(executable
        executable.cpp
)
```

## Documentation format

For documentation style, please checkout: [Documentation Format](/qh3LSmI9TQC1OI_7pyxDFQ)
