Стандарт кодування
Цей посібник визначає правила надання коду для бібліотеки SiMa.ai Neat.
Обмеження щодо мови та API.
- Використовуйте C++20.
- Зміни у публічному API мають бути обґрунтованими та мінімальними (версію
include/*слід вважати стабільною). - Віддавайте перевагу розширенням, сумісним зі старими версіями, замість змін, які порушують сумісність.
- Не розміщуйте внутрішні деталі реалізації в встановлених/публічних заголовкових файлах.
Форматування та дотримання єдиного стилю
- Форматування коду C/C++ забезпечується за допомогою
clang-format(.clang-formatу кореневій директорії репозиторію). - Дотримання стилю CMake забезпечується за допомогою
scripts/check_cmake_style.py. - Повторне включення вхідних файлів у вихідному коді C/C++ заборонено.
.editorconfigвизначає базові правила щодо пробілів (перехід на новий рядок, остаточний перехід на новий рядок, відсутність зайвих пробілів у кінці рядка).
Запустіть перед відправленням:
bash scripts/check_format.sh --changed-only
bash scripts/check_cmake_format.sh --changed-only
bash scripts/check_duplicate_includes.sh --changed-only
Політика сумісності API
Сумісність із загальнодоступним API є обов’язковою вимогою для всіх встановлених файлів заголовків, що містяться в include/*.
- Перевага надається незмінним доповненням (нові перевантаження, нові необов’язкові поля, нові API).
- Зміни, що порушують сумісність (перейменування/видалення/зміна типу/зміна порядку параметрів/порушення поведінкового контракту), повинні проходити процес перевірки перед об’єднанням.
- Якщо неминуче потрібно внести зміни, несумісні з попередніми версіями, спочатку передбачте період поступового вилучення (залиште стару сигнатуру + додайте альтернативний спосіб використання), а вже потім видаліть старий код.
Необхідний процес для зламу цифрових підписів API.
Перед об’єднанням змін, що порушують сумісність API:
- Опишіть зміни в описі до запиту на внесення змін (PR) у спеціальному розділі під назвою
Breaking API Change. - Включіть аналіз наслідків: перелік задіяних заголовків/символів, очікувані проблеми, які можуть виникнути в подальшому, та етапи міграції.
- Вкажіть інформацію про версію/план випуску (коли дозволено випускати оновлення).
- Оновіть документацію та приклади, щоб вони відповідали новому API, в рамках одного й того ж набору змін.
- Отримайте чітке схвалення від відповідальних за підтримку щодо змін, які впливають на інтерфейс програмування застосунків (API).
Межі модуля
Дотримуйтеся суворих правил щодо залежностей:
builder/не повинен залежати від GStreamer абоpipeline/.gst/не повинен залежати відpipeline/.nodes/не повинні залежати відpipeline/.pipeline/є головним компонентом, який координує роботу та може залежати відgst/,builder/,nodes/,contracts/,policy/та внутрішніх компонентів моделі.
Вимоги до детермінованості
- Вихідні дані вузла повинні бути детермінованими для однакових вхідних даних/налаштувань.
- Забезпечте стабільність і відтворюваність назв елементів.
- За можливості, забезпечте детерміноване генерування рядків у конвеєрі.
- Під час зміни правил іменування переконайтеся, що діагностичні інструменти та процедури перевірки все ще правильно пов’язують елементи з відповідними вузлами.
Обробка помилок і діагностика
- Віддавайте перевагу структурованим помилкам із чітким описом та можливістю їх усунення.
- Переконайтеся, що нові сценарії виникнення помилок містять достатньо інформації для діагностики, яка буде включена до звіту
PipelineReportпро роботу конвеєра. - Уникайте непомітних механізмів резервного копіювання, які приховують помилки плагінів/модулів/середовища виконання.
- Забезпечте потокобезпечність діагностичних функцій; для оновлення даних на стороні зонда необхідно використовувати атомарні операції або еквівалентні примітиви без блокувань.
Паралельність і життєвий цикл
- Ніколи не блокуйте процес на невизначений термін під час виконання процедур завершення роботи.
- Забезпечте захищений перехід між станами під час роботи програми (
EOS,NULL), передбачте безпечні шляхи завершення роботи, що захищають від перевищення часу очікування. - Забезпечте, щоб логіка потоку даних для потокового передавання була простою та мала передбачувані побічні ефекти.
Обов’язки щодо ведення документації.
Коли змінюється поведінка:
- Оновіть Архітектура.
- Оновіть довідкові матеріали для користувачів, якщо змінилися робочі процеси або налаштування.
- Задокументуйте нові змінні середовища в довідковій документації.
Якість у процесі розробки (PR) має бути на високому рівні.
Матеріал готовий до публікації, якщо він містить:
- Чітке обґрунтування в коді та повідомленні про внесення змін/запит на об’єднання змін.
- Тестування нової функціональності та виявлення регресій.
- Оновлено документацію для будь-яких змін, які будуть помітні користувачам.
- Оцінка сумісності API для змін у загальнодоступних заголовках (і повний процес внесення несумісних змін, якщо це необхідно).