- Все классы у которых нет декларации в .h файле должны находиться в анонимном неймспейсе, а все функции у которых нет декларации в .h должны быть помечены как
static TDSVWriter=>TDsvWriter- аббревиатуры пишем маленькими буквами- Не используем сокращения, кроме общепринятых (типа
len,idx,tmp). - Однобуквенные переменные только для цикла for (в порядке вложенности:
i,j,k). Включая тесты и однострочные функции. - В названии функции используем глаголы, глагол идет на первом месте:
ui64 FeatureCount()=>ui64 GetFeatureCount()если просто геттер,ui64 CountFeatures(), если там какая-то работа в функции. - Имена файлов - через подчеркивание. И без сокращений тоже.
- Про пустые строки:
- В большинстве случаев достаточно одной пустой строки.
- Две пустые строки норм ставить на верхнем уровне: между функциями, классами или классом и функцией (можно и одну)
- Три -- вообще никогда не нужно.
- Параметры в функциях передаются в следующем порядке:
- Входные (in) параметры (если есть)
- Параметры, состояние которых функция и использует и меняет (inout) (если есть). Обязательно передавать по указателю.
- Выходные (out) параметры (функция полностью меняет их состояние, не используя текущее, в отличие от inout). Обязательно передавать по указателю.
- Пробел после 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);