wiki.js/ru/dev/Style_code.md

100 lines
7.8 KiB
Markdown
Raw Normal View History

2021-01-01 20:57:12 -08:00
---
2021-01-05 05:02:49 -08:00
title: Руководство по стилю программирования Style Guide
2021-01-01 20:57:12 -08:00
description: Style guidelines used within the Speeduino firmware
published: true
2021-01-12 04:47:03 -08:00
date: 2021-01-12T12:46:53.403Z
2021-01-01 20:57:12 -08:00
tags:
editor: markdown
dateCreated: 2021-01-02T04:57:03.173Z
---
2021-01-05 04:16:26 -08:00
# Цель
2021-01-12 04:47:03 -08:00
Программное обеспечение Speeduino стремится к общему, унифицированному подходу к компоновке кода на основе рекомендаций на этой странице. Любые запросы или представления должны в максимально возможной степени соответствовать этим рекомендациям.
2021-01-01 20:57:12 -08:00
2021-01-05 04:16:26 -08:00
## Замечания о соблюдении MISRA
Speeduino стремится к соблюдению стандарта кодирования MISRA C:2012, и многие из приведенных ниже конвенций должны соответствовать этому. Полное описание требований MISRA C:2012 выходит за рамки данного документа, но код включает скрипт сканирования MISRA, основанный на cppcheck, который можно использовать для проверки изменений кода
2021-01-01 20:57:12 -08:00
2021-01-05 04:16:26 -08:00
# Детали
## Структура файла
2021-01-01 20:57:12 -08:00
2021-01-05 04:16:26 -08:00
В программных кодах ('.ino') элементы должны располагаться в следующей последовательности:
2021-01-01 20:57:12 -08:00
2021-01-05 04:31:31 -08:00
1. Обязательный комментарий к заголовку, описывающий назначение файла
2. включенные файлы (`#include`)
3. определения (`#define`)
4. локальные типы структуры local struct typedefs
2021-01-05 04:37:47 -08:00
5. локальные пототипыр local prototypes
2021-01-05 04:31:31 -08:00
6. Определения любых глобальных переменных global vars
7. Основная функция (при наличии) Main function
8. Локальные функции Local functions
2021-01-01 20:57:12 -08:00
2021-01-05 04:31:31 -08:00
В заголовке C (`.h`) элементы файла должны располагаться в следующей последовательности:
2021-01-01 20:57:12 -08:00
2021-01-05 04:37:47 -08:00
1. Комментарий к заголовку Header comment
2021-01-12 04:47:03 -08:00
2. защита подключения ifndef guard
2021-01-05 04:37:47 -08:00
3. включенные файлы (`#include`)
4. определения (`#define`)
5. определения структур struct typedefs
2021-01-12 04:47:03 -08:00
6. пототипы prototypes
2021-01-05 04:37:47 -08:00
7. (внешние) глобальные переменные (extern) global vars
2021-01-01 20:57:12 -08:00
2021-01-05 05:02:19 -08:00
## Имена файлов
2021-01-01 20:57:12 -08:00
2021-01-05 05:02:19 -08:00
Все имена должны быть значимыми и соответствовать существующим шаблонам использования, если они имеются.
## Соглашения о присвоении имен
| Предмет | Стандарт | Пример |
2021-01-01 20:57:12 -08:00
|---------------------------------------------|--------------------------------------------------------------|---------------------------|
2021-01-05 05:02:19 -08:00
| Функция | camelCase, с строчная первая буква, нет пробелов или _ | `readSensor();` |
| Переменные | Также как функции |`sensorValue = 0;` |
| Анонимные переменные (например, некоторые счетчики циклов) | Однострочная буква (предпочтительный порядок или использование: x, y, z, i) | `x++;` |
| Постоянные | ВЕРХНИЙ_РЕГИСТР, слова, соединенные с _ | `#define TWO_SQUARED 4` |
## Макет и пробел Layout and whitespace
- Использование пробелов для отступов, а не табуляции
- Отступы 2 пробела на уровень
- Всегда использовать {}, даже для отдельных блоков инструкций
- описывать структуры блоков с помощью отступа, не полагаться только на {}
- Для блоков с несколькими линиями скобки всегда должны иметь собственную линию:
2021-01-01 20:57:12 -08:00
```
void readSensors()
{
analogRead(sensor1);
  analogRead(sensor2);
}
```
2021-01-05 05:02:19 -08:00
- Однострочные блоки (операторы if/else и т.д.) должны находиться в одной строке и содержать фигурные скобки
- При использовании в одной строке должно быть заключительное пространство после {и предшествующее пространство перед}
2021-01-01 20:57:12 -08:00
` if(fanEnabled) { digitalWrite(fanPin, HIGH); }`
2021-01-05 05:02:19 -08:00
## Декларации Declarations
- Объявить переменные в верхней части функции
- В блоке связанных определений вертикальное выравнивание имен, типов и инициализаций
- Инициализируйте переменные, близкие к месту их первого использования.
2021-01-01 20:57:12 -08:00
2021-01-05 05:02:19 -08:00
## Функции Functions
- Также поместите возвращаемый тип в ту же строку, что и имя функции
- Функции должны быть короткими и разбиваться на подфункции по мере необходимости
- Каждая функция должна иметь одну четко определенную цель, эта цель должна быть отражена в её названии.
2021-01-01 20:57:12 -08:00
2021-01-05 05:02:19 -08:00
## Исполняемые инструкции Executable Statements
- По одному на строку, не i=0; j=0;
- При необходимости допускается выполнение нескольких операций в каждой строке. Например: i = j = 0;
2021-01-12 04:47:03 -08:00
- Правда/Ложь - True/False, если операторы **always** используют сравнение (либо 0, либо 1, либо true и false). Например:
2021-01-01 20:57:12 -08:00
- Good: `if(isEnabled == 1)`
- Bad: `if(isEnabled)`
2021-01-05 05:02:19 -08:00
- Не используйте оператор запятой для нескольких определений переменных в одной строке
## Определения функций Function definitions
- Использовать встроенную статику для всех неинтерфейсных функций
- Использовать прототипы для всех функций (даже возвращаемых int или void)
- Не отключать проверку типа параметра в прототипах с помощью (), используйте вместо этого (void)
- Давайте понятные имена переменных в прототипах
## Комментарии Comments
- НАСТОЯТЕЛЬНО рекомендуется использовать синтаксис комментария Doxygen (http://www.doxygen.nl/manual/docblocks.html)
- Комментарии блоков должны использоваться для любого отдельного комментария длиннее одной строки
- Отдельные комментарии предпочтительны в конце строки, а не в их собственной строке заранее