122 lines
2.5 KiB
Markdown
122 lines
2.5 KiB
Markdown
# Coding Style
|
|
|
|
## 1. General rules
|
|
|
|
Code must optimize for readability, correctness, and maintainability.
|
|
|
|
Avoid clever code when a straightforward implementation is easier to verify.
|
|
|
|
## 2. C standard
|
|
|
|
The TUI uses C17.
|
|
|
|
The project will initially target a strict warning profile similar to:
|
|
|
|
```text
|
|
-Wall
|
|
-Wextra
|
|
-Wpedantic
|
|
-Wconversion
|
|
-Wshadow
|
|
-Wformat=2
|
|
```
|
|
|
|
Warnings must be reviewed individually.
|
|
|
|
Do not disable a warning globally merely to hide one inconvenient case.
|
|
|
|
## 3. Naming
|
|
|
|
Public symbols use a `trainlog_` prefix.
|
|
|
|
Examples:
|
|
|
|
```c
|
|
trainlog_database_open(...)
|
|
trainlog_session_import(...)
|
|
```
|
|
|
|
Internal static functions use descriptive snake_case names.
|
|
|
|
Types use descriptive names and avoid unnecessary abbreviations.
|
|
|
|
## 4. Functions
|
|
|
|
Functions should:
|
|
|
|
- have one clear purpose;
|
|
- validate arguments when required by their contract;
|
|
- return explicit status values;
|
|
- avoid hidden global state.
|
|
|
|
Prefer small composable functions over long functions mixing unrelated responsibilities.
|
|
|
|
## 5. Comments
|
|
|
|
Comments are required for:
|
|
|
|
- public interfaces;
|
|
- invariants;
|
|
- non-obvious behavior;
|
|
- important ownership rules;
|
|
- format assumptions;
|
|
- error-handling decisions;
|
|
- algorithms whose intent is not immediately obvious.
|
|
|
|
Bad:
|
|
|
|
```c
|
|
i++; /* Increment i. */
|
|
```
|
|
|
|
Good:
|
|
|
|
```c
|
|
/*
|
|
* Keep the external exercise identifier unchanged after creation.
|
|
* Historical session rows refer to this stable identifier even when
|
|
* the user later renames the exercise.
|
|
*/
|
|
```
|
|
|
|
## 6. Formatting
|
|
|
|
The project will use `clang-format`.
|
|
|
|
A canonical `.clang-format` file will be added before substantial C implementation.
|
|
|
|
Formatting changes should not be mixed with unrelated semantic changes when avoidable.
|
|
|
|
## 7. Error handling
|
|
|
|
Do not silently ignore errors.
|
|
|
|
Do not use process termination for normal recoverable library errors.
|
|
|
|
Return explicit status codes from internal APIs where practical.
|
|
|
|
User-facing errors must be understandable and actionable.
|
|
|
|
## 8. Ownership
|
|
|
|
Every API that allocates, borrows, or transfers ownership must document that behavior.
|
|
|
|
Do not rely on ambiguous lifetime assumptions.
|
|
|
|
## 9. Integer and conversion safety
|
|
|
|
Avoid implicit narrowing conversions.
|
|
|
|
Validate external numeric input before conversion.
|
|
|
|
Use types appropriate to the stored range and document any format bounds.
|
|
|
|
## 10. Kotlin
|
|
|
|
The Android side should favor:
|
|
|
|
- immutable data where practical;
|
|
- explicit state transitions;
|
|
- small view models;
|
|
- no unnecessary framework abstraction;
|
|
- clear serialization types matching the Trainlog JSON contract.
|