- Все классы у которых нет декларации в .h файле должны находиться в анонимном неймспейсе, а все функции у которых нет декларации в .h должны быть помечены как
static
TDSVWriter
=>TDsvWriter
- аббревиатуры пишем маленькими буквами- Не используем сокращения, кроме общепринятых (типа
len
,idx
,tmp
). - Однобуквенные переменные только для цикла for (в порядке вложенности:
i
,j
,k
). Включая тесты и однострочные функции. - В названии функции используем глаголы, глагол идет на первом месте:
ui64 FeatureCount()
=>ui64 GetFeatureCount()
если просто геттер,ui64 CountFeatures()
, если там какая-то работа в функции. - Имена файлов - через подчеркивание. И без сокращений тоже.
- Про пустые строки:
- В большинстве случаев достаточно одной пустой строки.
- Две пустые строки норм ставить на верхнем уровне: между функциями, классами или классом и функцией (можно и одну)
- Три -- вообще никогда не нужно.
- Параметры в функциях передаются в следующем порядке:
- Входные (in) параметры (если есть)
- Параметры, состояние которых функция и использует и меняет (inout) (если есть). Обязательно передавать по указателю.
- Выходные (out) параметры (функция полностью меняет их состояние, не используя текущее, в отличие от inout). Обязательно передавать по указателю.
- Оунер проекта -- группа
g:matrixnet
- Пробел после template:
template <class TSomeType> class TMyClass { };
- Отступы при объявлении или вызове функции с большим числом и/или длиной параметров - аргументы начинаются со строки 2 + отступ в 4 пробела.
void WriteHistory( const TVector<TString>& metricsDescription, const TVector<TVector<double>>& learnErrorsHistory, const TVector<TVector<TVector<double>>>& testErrorsHistory, // [iter][test][metric] const TVector<TVector<double>>& timeHistory, const TString& learnToken, const TVector<const TString>& testTokens, TLogger* logger) {
- Длина строки <= 110 символов
- Для размеров (массивов, но не только) и индексов следует предпочитать беззнаковые типы конкретного размера (для портабельности) -
ui64
,ui32
, ... . Следует помнить, что CatBoost может работать с потенциально большими данными, так что во многих случаях (когда это не экономит память) разумным умолчанием будет являтьсяui64
. - Если весь код модуля находится только в заголовочном файле (
<module_name>.h
), то все равно нужно создать парный ему<module_name>.cpp
файл, который будет содержать только#include "<module_name>.h"
и включить этот .cpp файл в SRCS в ya.make. - Если при вызове функции из чтения кода вызова сразу не ясно, что значит выражение, передаваемое как какой-то из параметров (например, это bool литерал -
true
илиfalse
, в функции у которой несколько параметров такого типа), то рекомендуется вставить inline комментарий с названием параметра перед передаваемым выражением:MySort(/*useParallelImplementation*/ true, &container);